Сопоставить один data.frame с другим - PullRequest
0 голосов
/ 22 октября 2018

Дано df1, которое является подмножеством df2 (меньшее количество столбцов):

df1 <- data.frame(Species = letters[1:10])
df2 <- iris

Я хочу отобразить df1, чтобы иметь такое же количество столбцов, как df2 содинаковые имена.Мое решение:

mapDf <- function(df, dfToMap) {

  result <- data.frame(matrix(ncol = ncol(dfToMap), nrow = nrow(df)))
  colnames(result) <- colnames(dfToMap)

  for(c in colnames(dfToMap)) {
    if(c %in% colnames(df)) {
      result[, c] <- df[, c]
    }
  }

  result
}

тест:

mapDf(df1, df2)

Есть идеи, как это упростить?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

С data.table ....

library(data.table)
res = setDT(df2[NA_integer_, ])[df1, on=names(df1)]
setcolorder(res, names(df2))

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
 1:           NA          NA           NA          NA       a
 2:           NA          NA           NA          NA       b
 3:           NA          NA           NA          NA       c
 4:           NA          NA           NA          NA       d
 5:           NA          NA           NA          NA       e
 6:           NA          NA           NA          NA       f
 7:           NA          NA           NA          NA       g
 8:           NA          NA           NA          NA       h
 9:           NA          NA           NA          NA       i
10:           NA          NA           NA          NA       j

(Я не уверен, необходим ли setcolorder или если res уже будет иметь тот же порядок col, что и df2.)

Идея «отсутствующего фрагмента» объекта x[NA_integer_,] или «пустого фрагмента» x[0L,] также может быть найдена в пакете vetr, где последний называется «шаблоном».,(Я не уверен, будет ли это полезно для варианта использования OP или нет.)

0 голосов
/ 22 октября 2018

Вы можете упростить это с

map_data_frames <- function(df1, df2, fill = NA) {
   cols <- colnames(df2) %in% colnames(df1)
   df1[names(df2[!cols])] <- fill
   df1[, colnames(df2)] #From @zx8754 in comments      
}

map_data_frames(df1, df2)

#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1            NA          NA           NA          NA       a
#2            NA          NA           NA          NA       b
#3            NA          NA           NA          NA       c
#4            NA          NA           NA          NA       d
#5            NA          NA           NA          NA       e
#6            NA          NA           NA          NA       f
#7            NA          NA           NA          NA       g
#8            NA          NA           NA          NA       h
#9            NA          NA           NA          NA       i
#10           NA          NA           NA          NA       j
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...