我有以下数据框:
Row Repro Number2
1 1 EWC
2 NA LWY
3 7 EWS
4 NA LWC
5 NA EWC
6 NA LWC
7 3 EWY
8 NA LW2Y
9 NA Unknown
10 NA LWC
11 1 EWC
12 NA LWY
13 NA EWY
14 NA LWY
15 NA Unknown
16 NA LWC
在这个数据框中,我使用了以下循环:
for (i in 1:nrow(df3)) {
if(df3$Number2[i+1]=="Unknown" & is.na(df3$Repro[i])) {
df3$Number2[i]="Unknown"
} else{
df3$Number2[i]==df3$Number2[i]
}
}
当循环运行时,我在最后得到一个错误代码, Dataframe 看起来不像我想要的结果。
我的问题是,当代码执行其预期目的时(如果number2列后面的值也是"未知",并且关联的Repro值是NA,则用"未知"替换该列中的值),它只对数据流中最初的"未知"值执行此操作。我希望它也考虑到添加的新"未知",并使用这些值执行循环条件。
下面是错误代码:
Error in if (df3$Number2[i + 1] == "Unknown" & is.na(df3$Repro[i])) { :
missing value where TRUE/FALSE needed
这是运行循环后的 Dataframe 。我添加了另一个名为"Number2.Correct"的列,显示我希望Number2列实际上是什么样子。问题是第12行和第13行-它们应该是"Unknows",而不是"LWY"和"EWY"。
Repro Number2 Number2.Correct
1 1 EWC EWC
2 NA LWY LWY
3 7 EWS EWS
4 NA LWC LWC
5 NA EWC EWC
6 NA LWC LWC
7 3 EWY EWY
8 NA Unknown Unknown
9 NA Unknown Unknown
10 NA LWC LWC
11 1 EWC EWC
12 NA LWY Unknown
13 NA EWY Unknown
14 NA Unknown Unknown
15 NA Unknown Unknown
16 NA LWC LEW
最后,我有两个问题:
1.如何更改代码以获得所需的结果?
1.为什么会出现错误代码?它是否是导致此问题的部分原因?
3条答案
按热度按时间4szc88ey1#
创建于2023-01-09,使用reprex v2.0.2您遇到两个问题:
i + 1
超出数据中最后一行的范围;我添加了另一个条件(i + 1 < nrow(df3)
)1.您发布的输出结果表明,您希望从下到上而不是从上到下查找
Unknown
。piv4azn72#
代码失败的原因是
nrow(df3)+1
超出范围,因此for循环需要为1:(nrow(df3)-1)
要迭代更新Number2,一个简单的方法(虽然不太优雅)是使用while循环,停止条件是新旧
Number2
相同。py49o6xq3#
i+1
在数据的nrow
之后超出范围。我们可以对tidyverse
使用分组方法数据