这是我的数据集的示例:
>data
C1 C2 C3 C4 C5 C6
ATOM 1 -4.794 -7.29 6.756 C
ATOM 1 -4.357 -6.181 6.473 O
ATOM 2 -5.878 -8.511 5.233 C
ATOM 2 -7.02 -9.179 5.732 C
ATOM 3 -7.479 -9.499 6.108 C
ATOM 5 -4.873 -7.021 6.767 C
ATOM 8 -3.891 -6.723 6.31 O
ATOM 1 -7.515 -10.402 -0.621 C
ATOM 1 -7.26 -11.716 -0.22 O
ATOM 2 -7.53 -10.348 0.581 C
ATOM 3 -6.689 -11.008 2.344 C
最终,我想要实现的是有一个新列,可以检测C2中的数字何时重置为1,如下所示:
>data
C1 C2 C3 C4 C5 C6 C7
ATOM 1 -4.794 -7.29 6.756 C 1
ATOM 1 -4.357 -6.181 6.473 O 1
ATOM 2 -5.878 -8.511 5.233 C 1
ATOM 2 -7.02 -9.179 5.732 C 1
ATOM 3 -7.479 -9.499 6.108 C 1
ATOM 5 -4.873 -7.021 6.767 C 1
ATOM 8 -3.891 -6.723 6.31 O 1
ATOM 1 -7.515 -10.402 -0.621 C 2
ATOM 1 -7.26 -11.716 -0.22 O 2
ATOM 2 -7.53 -10.348 0.581 C 2
ATOM 3 -6.689 -11.008 2.344 C 2
我使用带有嵌套if语句的for循环。我的方法是将现有行与下一行进行比较。如果该值小于/等于现有值,我将1分配给新列 - 如果不是,则将旧计数增加1.
C7 = NULL
i <- 1
index <- 1
for ( i in 1:nrow(data)){
if(data$C2[i] <= data$C2[i+1]){
data$C7 = index
} else {
data$C7 <- index + 1
}
}
**This code doesnt work and this error occurs
Error in if (data$C2[i] <= data$C2[i + 1]) { :
missing value where TRUE/FALSE needed **
我不太确定我做错了什么,并且觉得有更好的方法可以做到这一点。我感谢任何帮助 - 谢谢你提前!
答案 0 :(得分:2)
您不需要循环:
data$C7 <- c(1, cumsum(diff(data$C2) < 0) + 1)
C1 C2 C3 C4 C5 C6 C7
1 ATOM 1 -4.794 -7.290 6.756 C 1
2 ATOM 1 -4.357 -6.181 6.473 O 1
3 ATOM 2 -5.878 -8.511 5.233 C 1
4 ATOM 2 -7.020 -9.179 5.732 C 1
5 ATOM 3 -7.479 -9.499 6.108 C 1
6 ATOM 5 -4.873 -7.021 6.767 C 1
7 ATOM 8 -3.891 -6.723 6.310 O 1
8 ATOM 1 -7.515 -10.402 -0.621 C 2
9 ATOM 1 -7.260 -11.716 -0.220 O 2
10 ATOM 2 -7.530 -10.348 0.581 C 2
11 ATOM 3 -6.689 -11.008 2.344 C 2