2016-11-15 126 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