按顺序应用匹配并在数据框中的一系列行上替换函数

pan*_*tts 10 r apply dataframe

启动数据帧

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
Run Code Online (Sandbox Code Playgroud)

添加三个列标题,下面是空列.附加起始值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
Run Code Online (Sandbox Code Playgroud)

我想更新我的var1:var3应用功能,以每一行,其中IF列marker= yesAND id_out匹配任何一个var1:var3,更换任何var1:var3id_new.我找到了这个解决方案,但适用于一行代码,仍然需要var1:var3更新行的每个新部分.

data_start[1, 4:6][data_start[1, 4:6] == data_start[1,"id_out"]] <- data_start[1,"id_new"]
Run Code Online (Sandbox Code Playgroud)

在再次应用函数之前,每行还取决于使用上一行中的值.

最终输出看起来像这样,当标记= 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
Run Code Online (Sandbox Code Playgroud)

s-h*_*ins 1

这可以与任意数量的列一起使用,并与基本 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"]
    } 
  }
}
Run Code Online (Sandbox Code Playgroud)