将最后一个值替换为数据框中连续行中的第一个值

时间:2018-05-04 12:21:48

标签: r

我想将同一行结尾的2“NA”替换为同一行的前2个值。并且对于每个具有“NA”的连续行执行此操作,即在我的数据帧“Vracpop1”中为98行。 我正在搜索和搜索,但我不能这样做...感谢您的帮助!

Vracpop1
    individuals pop loc1 loc2 loc3 loc4 loc5 loc6 loc7 loc8 loc9 loc10 loc15
1           1_1   1  499  501  500  500  500  500  499  500  500   499   501
2           499 501  500  501  500  500  499  500  500  500  500    NA    NA
3           1_2   1  499  501  500  500  500  500  500  500  500   499   501
4           499 501  500  500  500  500  499  500  500  500  500    NA    NA
5           1_3   1  499  501  500  501  500  500  499  500  500   500   501
6           499 501  500  500  500  500  499  500  500  500  500    NA    NA
...

1 个答案:

答案 0 :(得分:0)

有很多不同的方法可以实现这一目标。这是一个基础R解决方案:

df$individuals <- as.character(df$individual);
sel <- rowSums(is.na(df[, (ncol(df)-1):ncol(df)])) == 2;
df[sel, (ncol(df)-1):ncol(df)] <- df[sel, 1:2];
#  individuals pop loc1 loc2 loc3 loc4 loc5 loc6 loc7 loc8 loc9 loc10 loc15
#1         1_1   1  499  501  500  500  500  500  499  500  500   499   501
#2         499 501  500  501  500  500  499  500  500  500  500   499   501
#3         1_2   1  499  501  500  500  500  500  500  500  500   499   501
#4         499 501  500  500  500  500  499  500  500  500  500   499   501
#5         1_3   1  499  501  500  501  500  500  499  500  500   500   501
#6         499 501  500  500  500  500  499  500  500  500  500   499   501

说明:(ncol(df)-1):ncol(df)选择最后两列;如果最后两列中的条目都是rowSums(is.na(...)) == 2,则TRUE会返回NA。在sel == TRUE的行中,我们使用前两列中的条目替换最后两列中的NA个条目。

样本数据

df <- read.table(text =
    "    individuals pop loc1 loc2 loc3 loc4 loc5 loc6 loc7 loc8 loc9 loc10 loc15
1           1_1   1  499  501  500  500  500  500  499  500  500   499   501
2           499 501  500  501  500  500  499  500  500  500  500    NA    NA
3           1_2   1  499  501  500  500  500  500  500  500  500   499   501
4           499 501  500  500  500  500  499  500  500  500  500    NA    NA
5           1_3   1  499  501  500  501  500  500  499  500  500   500   501
6           499 501  500  500  500  500  499  500  500  500  500    NA    NA", header = T, row.names = 1)