将一个data.frame映射到另一个

时间:2018-10-22 14:03:56

标签: r

给出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 :(得分:3)

您可以使用

来简化它
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

答案 1 :(得分:3)

带有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是否已经具有与df2相同的列序。)

对象x[NA_integer_,]或“空切片” x[0L,]的“缺失切片”的想法也可以在vetr包中找到,后者被称为“模板” 。 (我不确定这对OP的用例是否有用。)

相关问题