使用带条件的另一个数据帧替换一个数据帧中多列的值

sou*_*ind 5 r dataframe

您好,我有两个数据框,如下所示:

df1: 
ID   x    y     z     
1    a    b     c     
2    a    b     c
3    a    b     c 
4    a    b     c
Run Code Online (Sandbox Code Playgroud)

和 df2:

ID   x    y     
 2   d    NA
 3   NA   e
Run Code Online (Sandbox Code Playgroud)

我正在追求这样的结果:

df1:

    ID   x    y     z     
    1    a    b     c     
    2    d    b     c
    3    a    e     c 
    4    a    b     c
Run Code Online (Sandbox Code Playgroud)

我一直在尝试按照其他一些帖子的建议使用匹配函数,但我不断遇到问题,其中我的 df1 数据帧被 df2 中的 NA 值替换。这是我一直在使用但运气不佳的代码

for (i in names(df2)[2:length(names(df2))]) {
  df1[i] <- df2[match(df1$ID, df2$ID)]
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Ale*_*ade 0

你的代码不适合我,所以我稍微改变了一下,但它有效。如果您正在从外部文件读取数据,请在stringAsFactor = FALSE读取数据时使用 ,这样就不会遇到问题。

df1 = data.frame("ID" = 1:4,"x" = rep("a",4), "y" =rep("b",4),"z" = rep("c",4),
                 stringsAsFactors=FALSE)
df2 = data.frame("ID" = 2:3,"x" = c("d",NA), "y" = c(NA,"e"),stringsAsFactors=FALSE)

for(i in 1:nrow(df2)){
  new_data = df2[i,-which(apply(df2[i,],2,is.na))]
  pos = as.numeric(new_data[1])
  col_replace = intersect(colnames(new_data),colnames(df1))
  df1[pos,col_replace] = new_data
}
Run Code Online (Sandbox Code Playgroud)