矢量化按列合并两个数据帧的for循环

时间:2014-07-28 11:33:23

标签: r for-loop merge dataframe

假设我有两个数据框df1df2

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中与df1df1中的列名称匹配的某些列名称始终包含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
  }
}

嗯,它有效。但我想知道是否有更清洁(更快)的解决方案来完成这项任务,或许可以利用矢量化操作。

3 个答案:

答案 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