Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R增量-避免循环_R_Loops - Fatal编程技术网

R增量-避免循环

R增量-避免循环,r,loops,R,Loops,我的数据是这样的。 每个id都被观察了好几次。 主要是每次观察的结果 我需要做的是每次主体发生变化时增加,因此每次观察的结果都与前一次不同 例如,第一个观测结果是20,然后是30,然后是连续的12 我最终需要的是这个 > dtd id main ep 1 1 20 1 2 1 30 2 3 1 12 3 4 1 12 3 5 1 12 3 6 1 15 4 7 1 15 4 8 2 30 1 9 2

我的数据是这样的。 每个id都被观察了好几次。 主要是每次观察的结果

我需要做的是每次主体发生变化时增加,因此每次观察的结果都与前一次不同

例如,第一个观测结果是20,然后是30,然后是连续的12

我最终需要的是这个

> dtd
   id main ep
1   1   20  1
2   1   30  2
3   1   12  3
4   1   12  3
5   1   12  3
6   1   15  4
7   1   15  4
8   2   30  1
9   2   12  2
10  2   12  2
11  2   23  3
12  2   23  3
因此,每当每个id发生变化时,都会增加

欢迎任何建议

我提出了这个循环,但它相当麻烦

for(i in 2:nrow(dtd)){
  if(dtd$id[i] == dtd$id[i-1] & dtd$main[i] != dtd$main[i-1] ){
     dtd$ep[i] = dtd$ep[i-1] + 1 
 }
  if(dtd$id[i] == dtd$id[i-1] & dtd$main[i] == dtd$main[i-1] ){
    dtd$ep[i] = dtd$ep[i-1]
  }
}
谢谢

数据

dtd <- structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2), main = c(20, 
    30, 12, 12, 12, 15, 15, 30, 12, 12, 23, 23), ep = c(1, 2, 3, 
    3, 3, 4, 4, 1, 2, 2, 3, 3)), .Names = c("id", "main", "ep"), row.names =
    c(NA, -12L), class = "data.frame")
您可以使用ave:

我发现cumsum和diff很难使用和调试,所以我会使用

library(data.table)
setDT(DF)[, ep := rleid(main), by=id]

   id main ep
1   1   20  1
2   1   30  2
3   1   12  3
4   1   12  3
5   1   12  3
6   1   15  4
7   1   15  4
8   2   30  1
9   2   12  2
10  2   12  2
11  2   23  3
12  2   23  3
    id main ep
 1:  1   20  1
 2:  1   30  2
 3:  1   12  3
 4:  1   12  3
 5:  1   12  3
 6:  1   15  4
 7:  1   15  4
 8:  2   30  1
 9:  2   12  2
10:  2   12  2
11:  2   23  3
12:  2   23  3
library(data.table)
setDT(DF)[, ep := rleid(main), by=id]
    id main ep
 1:  1   20  1
 2:  1   30  2
 3:  1   12  3
 4:  1   12  3
 5:  1   12  3
 6:  1   15  4
 7:  1   15  4
 8:  2   30  1
 9:  2   12  2
10:  2   12  2
11:  2   23  3
12:  2   23  3