2011-12-22 2 views
8

У меня есть 2 кадра данных с различным количеством столбцов каждый. Некоторые из столбцов являются общими для двух фреймов данных. Как я могу привязать только общие столбцы двух кадров данных к новому кадру данных?Как включить только общие столбцы двух наборов данных

Я попытался с 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

+0

Очень кратким и понятным. +1 –

+2

Не нужно использовать подмножество здесь - и обычно вы хотите избежать программирования с помощью любой функции, использующей нестандартную оценку. (И я не уверен, почему вы хотите использовать его, потому что он довольно многословный по сравнению с 'dfr1 [common_cols]') – hadley

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'? –

+0

Кроме того, вызов 'subset' не требуется. Если вы собираетесь использовать индексацию позже, вы можете просто передать им логический вектор, созданный 'names (df1)% in% names (df2)'. –

+0

как для вашего первого комментария: если df2 имеет столбцы, которые не находятся в df1 - они не распространены, и я не хочу их фильтровать - или я ошибаюсь? как для вашего второго комментария: правильно это было бы лучше, возможно, я сделал это немного слишком sloppy ... – Seb