起始数据框
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 yes
与id_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"]
}
}
}