2011-12-22 34 views
8

我有兩個數據框,每個列的數目都不同。一些列在兩個數據幀之間是相同的。我如何才能將兩個數據幀的公共列綁定到新的數據框?如何僅綁定兩個數據集的公共列

我試過library(plyr);rbind.fill(A,B)但是它在不匹配的列中設置了NA值,這對我沒有幫助。

非常感謝 EC

回答

23

使用intersect檢索共有列。

dfr1 <- data.frame(x = 1:5, y = runif(5), z = rnorm(5)) 
dfr2 <- data.frame(w = letter[1:5], x = 6:10, y = runif(5)) 
common_cols <- intersect(colnames(dfr1), colnames(dfr2)) 
rbind(
    subset(dfr1, select = common_cols), 
    subset(dfr2, select = common_cols) 
) 

正如評論指出的那樣,你可以用

rbind(
    dfr1[, common_cols], 
    dfr2[, common_cols] 
) 

替換最後一行的一個小的性能和打字的改善。

rbind(
    dfr1[common_cols], 
    dfr2[common_cols] 
) 

也有效,但我認爲這是一個稍微不太清楚。

+0

尼斯使用相交的! +1 – ECII 2011-12-22 14:24:23

+0

非常簡潔和易於理解。 +1 – 2011-12-22 18:45:49

+2

此處不需要使用子集 - 並且通常希望避免使用任何使用非標準評估的函數進行編程。 (我不確定你爲什麼要使用它,因爲它與'dfr1 [common_cols]'相比是相當詳細的) – hadley 2011-12-28 21:04:09

2

這裏是我的解決方案希望我把你的問題的權利

df1 <- data.frame(a=rnorm(100), b=rnorm(100), not=rnorm(100)) 
df2 <- data.frame(a=rnorm(100), b=rnorm(100)) 

bind1 <- bind1 <- df1[, names(df1) %in% names(df2)] 
bind2 <- bind1 <- df1[, names(df2) %in% names(df1)] 

rbind(bind1, bind2) 
+0

如果'df2'有不在'df1'中的列,會發生什麼? – 2011-12-22 14:18:48

+0

另外,調用'subset'不是必需的。如果您稍後要使用索引,則可以將它們傳遞給名稱(df1)%在%names(df2)'中創建的邏輯向量。 – 2011-12-22 14:21:15

+0

至於你的第一個評論:如果df2的列不在df1中 - 它們不常見,我不想過濾它們 - 或者我錯了嗎?至於你的第二個評論:對,這可能會更好,可能我做得有點過於草率...... – Seb 2011-12-22 14:25:12

相關問題