起始数据框

data_start <- data.frame(marker = c("yes","yes","no","yes","no"),
                         id_out = c(5,3,1,1,7),
                         id_new = c(6,8,9,4,2))

> data_start
  marker id_out id_new
1    yes      5      6
2    yes      3      8
3     no      1      9
4    yes      1      4
5     no      7      2

在下面添加三个带有空列的列标题。附加起始var1:var3值。
data_start[,c("var1", "var2", "var3")] <- NA
vars <- c(5,3,1)
data_start[1, 4:6] <- vars

> data_start
  marker id_out id_new var1 var2 var3
1    yes      5      6    5    3    1
2    yes      3      8   NA   NA   NA
3     no      1      9   NA   NA   NA
4    yes      1      4   NA   NA   NA
5     no      7      2   NA   NA   NA

我想通过在var1:var3 = marker AND yesid_out中的任何一个匹配,并将var1:var3中的任何一个替换为var1:var3的情况下,对每一行应用函数来更新id_new列。我找到了这种解决方案,但是只适用于一行代码,仍然需要更新该行中每个新的var1:var3部分。
data_start[1, 4:6][data_start[1, 4:6] == data_start[1,"id_out"]] <- data_start[1,"id_new"]

每行还取决于使用上一行中的值,然后再次应用该函数。

最终输出看起来像这样,其中当marker = no时,行保持不变,并且随后更新每行。
> data_final
  marker id_out id_new var1 var2 var3
1    yes      5      6    6    3    1
2    yes      3      8    6    8    1
3     no      1      9    6    8    1
4    yes      1      4    6    8    4
5     no      7      2    6    8    4

最佳答案

这可以与任意数量的列一起使用,并且可以与基数R一起使用:

cols <- c("var1", "var2", "var3")

for(j in 1:length(cols)) {
  var <- cols[j]
  for(i in 1:nrow(data_start)){
    if(i > 1) {
      data_start[i, var] <- data_start[i-1, var]
    }
    if(data_start[i, "marker"] == "yes" & data_start[i, var] == data_start[i,"id_out"]) {
      data_start[i,var] <- data_start[i, "id_new"]
    }
  }
}

10-08 04:08