2016-11-15 114 views
4

我有一个数据帧是与所有国家的缩写列:的R - 拆分一列数据帧到多列

Name 
AK 
AL 
AR 
AZ 
CO 
CT 
DC 
FL 

我想借此列,并将其拆分成多列,使得没有列有5个以上的细胞。

Name1 Name2 
AK  CT 
AL  DC 
AR  FL 
AZ 
CO 

我可以为我所想要做的代码,但必须有一个更好的办法:

states <- as.data.frame(state.abb) 

new.table <- as.data.frame(states[1:5,]) 

i <- 6 
k <- 2 

repeat{ 
    new.table[,k] <- as.data.frame(states[(i):(i+4),]) 
    i <- i + 5 
    k <- k + 1 
    if(i>nrow(states)){ 
    break 
    } 
} 

回答

5

如果NA是正常使用的空白值,那么我们就可以做下列。假设您的数据名为df,我们可以先创建一个用于分割数据的值向量。

(x <- rep(1:ceiling(nrow(df)/5), each = 5, length.out = nrow(df))) 
# [1] 1 1 1 1 1 2 2 2 

现在我们可以拆分数据,循环结果列表使每个元素长度为5,并强制数据帧。列名在此处即时创建。之后创建它们可能会更有效率。

as.data.frame(lapply(split(df$Name, paste0(names(df), x)), "length<-", 5)) 
# Name1 Name2 
# 1 AK CT 
# 2 AL DC 
# 3 AR FL 
# 4 AZ <NA> 
# 5 CO <NA> 
7

到@ RichScriven的概念相似,但使用matrix应对整形:

columniser <- function(x, n) { 
    m <- matrix(NA, nrow=n, ncol=ceiling(length(x)/n)) 
    m[1:length(x)] <- x 
    as.data.frame(m) 
} 

columniser(states$state.abb, 5) 
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 
#1 AL CO HI KS MA MT NM OK SD VA 
#2 AK CT ID KY MI NE NY OR TN WA 
#3 AZ DE IL LA MN NV NC PA TX WV 
#4 AR FL IN ME MS NH ND RI UT WI 
#5 CA GA IA MD MO NJ OH SC VT WY 

columniser(1:12, 5) 
# V1 V2 V3 
#1 1 6 11 
#2 2 7 12 
#3 3 8 NA 
#4 4 9 NA 
#5 5 10 NA