R 增量 - 避免循环

标签 r loops

我的数据如下所示。 每个 id 已被观察多次。 main 是每次观察的结果。

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

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

> dtd
  id main ep
1   1   20  1
2   1   30  1
3   1   12  1
4   1   12  1
5   1   12  1
6   1   15  1
7   1   15  1
8   2   30  1
9   2   12  1
10  2   12  1
11  2   23  1
12  2   23  1

我最终需要的是这个

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

DF$ep <- ave(DF$main, DF$id, FUN = function(x) cumsum(c(1L, diff(x) != 0)))

这给出了

   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

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

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

关于R 增量 - 避免循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32934062/

相关文章:

linux - 在 linux 文件中的每一行之前添加文本

r - 在 R(或 RStudio)中,我想将带单位的字段转换为数字,但收到错误警告

r - 具有自定义 bin 边缘的 ggplot2 密度直方图

google-maps - 使用 Google map 在 R 中进行地理编码

使用通用函数的 Python numpy 网格转换

计算二维字符数组中单词的出现次数

Python:如何根据位置输出FASTA头或染色体索引图?

使用 latex 中的条件颜色渲染表作为具有 rownames = TRUE 的 pdf 文档(rmarkdown、kable 和 kableExtra)

r - 使用 ggplot() 绘制路径和点图

java - 由于 obj.hasNext() 导致无限循环