Как привязать только общие столбцы двух наборов данных - PullRequest
8 голосов
/ 22 декабря 2011

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

Я пытался с library(plyr);rbind.fill(A,B), однако он устанавливает значения NA в столбцах, которые не совпадают, и это мне не помогает.

Большое спасибо EC

Ответы [ 3 ]

26 голосов
/ 22 декабря 2011

Используйте 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]
)

также работает, но я думаю, что это немного менее понятно.

2 голосов
/ 22 декабря 2011

Вот мое решение, надеюсь, я правильно понял ваш вопрос

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 голосов
/ 11 июня 2018

сделал свою собственную функцию для моего персонального пакета: (это работает также для более чем двух информационных кадров)

функция:

fast.rbind <- function(...,method=c("fill","common"),value=NA){
    if("fill"==method[1]) {
        fun1 <- function(x,y,value=NA){
            x[setdiff(colnames(y),colnames(x))] <- value

            y[setdiff(colnames(x),colnames(y))] <- value

            return(rbind(x,y))
        }
    }

    if("common"==method[1]) {
        fun1 <- function(x,y,value=NULL){
            common_cols <- intersect(colnames(x), colnames(y))
            return(rbind(x[, common_cols,drop=F],y[, common_cols,drop=F]))
        }
    }
    return(Reduce(function(x,y){fun1(x=x,y=y,value=value)},list(...)))
}

вызов +пример данных:

df1 <- mtcars[1:5,1:4]
df2 <- mtcars[6:10,2:5]
df3 <- mtcars[11:15,4:7]
fast.rbind(df1,df2,df3,method="common")
fast.rbind(df1,df2,df3,value="yourDesiredFill")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...