2017-06-01 56 views
3

例如一個大的數據幀,插入在重複位置空白欄的在R中

dataX = data.frame(a=c(1:5),b=c(2:6),c=c(3:7),d=c(4:8),e=c(5:9),f=c(6:10)) 

如何插入每2列之後的空白欄?

+0

爲什麼你想這樣做?出於某種原因你是否依靠列順序? –

+0

@docendodiscimus是的先生。我有一個重複1094列的數據框。我需要爲此撰寫一份研究論文,但如果我在重複的特定點上留有空白列,我的工作將變得非常容易。 –

回答

2

我們可以使用使用split分裂的獨特位置數據集成的data.frame,環list通過listcbindNAcbind元素一起

res <- do.call(cbind, setNames(lapply(split.default(dataX, (seq_len(ncol(dataX))-1)%/%2), 
       function(x) cbind(x, NewCol = NA)), NULL)) 
res 
# a b NewCol c d NewCol e f NewCol 
#1 1 2  NA 3 4  NA 5 6  NA 
#2 2 3  NA 4 5  NA 6 7  NA 
#3 3 4  NA 5 6  NA 7 8  NA 
#4 4 5  NA 6 7  NA 8 9  NA 
#5 5 6  NA 7 8  NA 9 10  NA 

names(res) <- make.unique(names(res)) 
+1

絕對完美。爲了提高我的知識和學習能力,請你用2行來解釋這是如何工作的?這將是非常有幫助的。 –

+0

@AKR謝謝,如果你注意到'split.default(dataX,(seq_len(ncol(dataX)) - 1)%/%2)',它會將data.frame分割成2列數據​​的list。每個框架。然後,我們循環訪問'list',並用'cbind'添加一個新的NA列。最後,所有'list'元素都被轉換爲一個單獨的數據框,其中'do.call(cbind' – akrun

0

讓我們建立一個空的數據幀相同的行數作爲DATAX

empty_df <- data.frame(x1=rep(NA,nrow(df)),x2=rep(NA,nrow(df)),x3=rep(NA,nrow(df))) 
dataX<-cbind(dataX,empty_df) 
dataX<-dataX[c("a","b","x1","c","d","x2","e","f","x3")] 

導致:

a b x1 c d x2 e f x3 
1 1 2 NA 3 4 NA 5 6 NA 
2 2 3 NA 4 5 NA 6 7 NA 
3 3 4 NA 5 6 NA 7 8 NA 
4 4 5 NA 6 7 NA 8 9 NA 
5 5 6 NA 7 8 NA 9 10 NA 
3

這是一個類似的方法,使用矩陣和整數列選擇技巧。原始data.frame獲得一個帶有cbind的NA列。然後用每兩列引用這個新對象的列,然後使用矩陣用rbind填充最後一列來填充最終的NA列。

cbind(dataX, NewCol=NA)[c(rbind(matrix(seq_along(dataX), 2), ncol(dataX)+1))] 
    a b NewCol c d NewCol.1 e f NewCol.2 
1 1 2  NA 3 4  NA 5 6  NA 
2 2 3  NA 4 5  NA 6 7  NA 
3 3 4  NA 5 6  NA 7 8  NA 
4 4 5  NA 6 7  NA 8 9  NA 
5 5 6  NA 7 8  NA 9 10  NA