起始数据框
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
应用功能,以每一行,其中IF列marker
= yes
ANDid_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"]
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句