假设我有两个数据框df1
和df2
。
df1 <- data.frame(matrix(c(0,0,1,0,0,1,1,1,0,1),ncol=10,nrow=1))
colnames(df1) <- LETTERS[seq(1,10)]
df2 <- data.frame(matrix(c(1,1,1,1),ncol=4,nrow=1))
colnames(df2) <- c("C","D","A","I")
df2
中与df1
和df1
中的列名称匹配的某些列名称始终包含df2
中可能出现的每个可能的列名称。我想为df1
添加一个新行,该行包含用于匹配列的df2值和用于非匹配列的0。我目前的方法使用for-loop
:
for(i in 1:ncol(df1)){
if(colnames(df1)[i] %in% colnames(df2)){
df1[2,i] <- df2[1,which(colnames(df2)==colnames(df1)[i])]
} else {
df1[2,i] <- 0
}
}
嗯,它有效。但我想知道是否有更清洁(更快)的解决方案来完成这项任务,或许可以利用矢量化操作。
答案 0 :(得分:2)
res <-merge(df1,df2,all=T)[,colnames(df1)]
res[is.na(res)] <- 0
res
# A B C D E F G H I J
# 1 0 0 1 0 0 1 1 1 0 1
# 2 1 0 1 1 0 0 0 0 1 0
答案 1 :(得分:1)
来自&#34; dplyr&#34;的rbind_all
效率可能更高:
library(dplyr)
rbind_list(df1, df2)
# A B C D E F G H I J
# 1 0 0 1 0 0 1 1 1 0 1
# 2 1 NA 1 1 NA NA NA NA 1 NA
分配给&#34; res&#34;并用&#34; 0&#34;替换NA
以@akrun确定的相同方式。
答案 2 :(得分:1)
只需使用作业:
df1[2,] <- 0
df1[2,names(df2)] <- df2
# A B C D E F G H I J
#1 0 0 1 0 0 1 1 1 0 1
#2 1 0 1 1 0 0 0 0 1 0
...只是为了证明它适用于其他值:
df2$C <- 8
df1[2,] <- 0
df1[2,names(df2)] <- df2
# A B C D E F G H I J
#1 0 0 1 0 0 1 1 1 0 1
#2 1 0 8 1 0 0 0 0 1 0