2017-07-27 59 views
1

我怎樣才能創建一個包含所有環境中的對象(DF)科拉姆名稱爲數據幀

防爆的列名的數據幀。擁有全球環境中所有對象的3個df。

chocolate <- data.frame(a = 1, b = 2, c = 3) 
banana <- data.frame(a = 2, d = 4, c = 3) 
pear <- data.frame(d = 1, e = 4) 

所需的輸出

output <- data.frame(id = c("chocolate","banana", "pear"), 
       v2 = c("a", "a", NA), 
       v3 = c("b", NA, NA), 
       v4 = c("c", "c", NA), 
       v5 = c(NA, "d", "d"), 
       v6 = c(NA, NA, "e")) 
output 
+5

什麼是你想用這個來完成?結構非常奇怪,你可以用更簡單的方式完成你想要的。 – lmo

+0

你可以使用'dplyr :: bind_rows(df1,df2,df3)',你應該得到一個可用的輸出。 –

+0

'dplyr :: bind_rows(ls())'如果有更多的數據框比OP關心輸出,並且沒有其他對象的方式。 –

回答

0

我們可以嘗試

library(data.table) 
lst <- mget(paste0("df", 1:3)) 
setnames(rbindlist(lapply(setNames(lst, seq_along(lst)), function(x) { 
     x[] <- names(x) 
      x}), fill = TRUE, idcol = 'id'), 2:6, paste0("V", 1:5))[] 
# id V1 V2 V3 V4 V5 
#1: 1 a b c NA NA 
#2: 2 a NA c d NA 
#3: 3 NA NA NA d e 
+0

您的解決方案不能用作一般解決方案。我希望代碼適用於**所有環境變量**。我用不同的名字更新這篇文章。 –

+0

@Alfredo_MF你可以在'mget'中放入任何你想要的東西。如果您想要環境中的每個對象,請使用'lst < - mget(ls())'。對於環境中的每個數據幀,使用'lst < - mget(ls())[sapply(mget(ls()),is.data.frame)]''。根據需要調整。如果您只想要具有特定模式的名稱,請使用ls()的'pattern'參數。如果你想隱藏對象,使用'all.names = T'。有關詳細信息,請參閱「?ls」。 – Gregor

+0

@Gregor我解決了這個問題,但是當我應用setnames函數時出現此錯誤:「無法在同一個查詢中分配兩次相同的列(檢測到重複」 –