2016-12-16 23 views
0

我有類似這樣的名單:cbind同樣名爲向量在列表中的多個data.frames到一個data.frame

set.seed(1602) 
l <- list(data.frame(subst_name = sample(LETTERS[1:10]), perc = runif(10), crop = rep("type1", 10)), 
     data.frame(subst_name = sample(LETTERS[1:7]), perc = runif(7), crop = rep("type2", 7)), 
     data.frame(subst_name = sample(LETTERS[1:4]), perc = runif(4), crop = rep("type3", 4)), 
     NULL, 
     data.frame(subst_name = sample(LETTERS[1:9]), perc = runif(9), crop = rep("type5", 9))) 

問題:我怎樣才能提取的subst_name列每個data.frame並將它們與cbind()(或類似的函數)結合到一個新的data.frame,而不會搞亂每個列的順序?此外,該列應相應作物類型來命名(這是可能的「原因的作物類型對於每個data.frame唯一的)

編輯:輸出應如下所示:

enter image description here

在閱讀了評論之後,我意識到,在R中它沒有什麼意義,但是爲了讓輸出結果更好,data.frame的View選項非常方便。

+1

這個問題並沒有什麼意義。結果應該是什麼樣子? – Ista

+0

請用數據說明您的預期結果。要使用cbind,行數必須相同或彼此相乘(即20和10個obs有效,但不是10和17 obs或20和23 obs)。 – Parfait

+0

我添加了所需的結果。爲了便於閱讀,我減少了矢量的長度。 – andrasz

回答

0

this SO-Question的幫助下,我想出了以下溶劑。 (可能還有改進的空間)

a <- lapply(l, '[[', 1) # extract the first element of the dfs in the list 
a <- Filter(function(x) !is.null(unlist(x)), a) # remove NULLs 
a <- lapply(a, as.character) 
max.length <- max(sapply(a, length)) 
## Add NA values to list elements 
b <- lapply(a, function(v) { c(v, rep(NA, max.length-length(v)))}) 
e <- as.data.frame(do.call(cbind, d)) 
names(e) <- unlist(lapply(lapply(lapply(l, '[[', "crop"), '[[', 2), as.character)) 
0

對給定示例執行此操作並不正確,因爲每個列表的數據框中的行數不相同。但是,如果你不關心你可以這樣做:

nullElements = unlist(sapply(l,is.null)) 
l = l[!nullElements] #delete useless null elements in list 
columns=lapply(l,function(x) return(as.character(x$subst_name))) 
newDf = as.data.frame(Reduce(cbind,columns)) 

如果你不想在列再生元素,你可以做

for(i in 1:ncol(newDf)){ 
    colLength = nrow(l[[i]]) 
    newDf[(colLength+1):nrow(newDf),i] = NA 
} 
newDf = newDf[1:max(unlist(sapply(l,nrow))),] #remove possible extra NA rows 

注意,我修改了以前的代碼刪除NULL項從l,以簡化事情

+0

這不會導致期望的輸出,因爲向量被回收(一旦它們到達最後一行),而它們應該被納入NA。對不起,編輯前的問題缺少。 – andrasz

相關問題