如何根据R中的另一列内容创建新列

时间:2014-02-18 06:54:56

标签: r

这是我的数据集的示例:

>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 **

我不太确定我做错了什么,并且觉得有更好的方法可以做到这一点。我感谢任何帮助 - 谢谢你提前!

1 个答案:

答案 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