给出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)
有什么想法可以简化它吗?
答案 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的用例是否有用。)