【问题标题】:Count the number previous items in by group in R [duplicate]在R中按组计算先前项目的数量[重复]
【发布时间】:2015-08-20 12:49:11
【问题描述】:

我想创建一个新变量来计算分组中先前项目的数量。这就是我的意思,以esoph 数据集为例。

首先我按我的分组esoph$agegp, esoph$alcgp 和一个附加值列-esoph$ncontrols 对数据集进行排序。

这给了我以下数据集

x<-esoph[order(esoph$agegp, esoph$alcgp, -esoph$ncontrols ), ]
x

   agegp     alcgp    tobgp ncases ncontrols
1  25-34 0-39g/day 0-9g/day      0        40
2  25-34 0-39g/day    10-19      0        10
3  25-34 0-39g/day    20-29      0         6
4  25-34 0-39g/day      30+      0         5
5  25-34     40-79 0-9g/day      0        27
6  25-34     40-79    10-19      0         7
8  25-34     40-79      30+      0         7
7  25-34     40-79    20-29      0         4
9  25-34    80-119 0-9g/day      0         2
11 25-34    80-119      30+      0         2
...

现在,我想创建一个具有某种索引的新变量,每行增加一个。每当下一个按组开始时,索引就会回到 1。

结果表如下(带有附加索引列):

   agegp     alcgp    tobgp ncases ncontrols index
1  25-34 0-39g/day 0-9g/day      0        40     1
2  25-34 0-39g/day    10-19      0        10     2
3  25-34 0-39g/day    20-29      0         6     3
4  25-34 0-39g/day      30+      0         5     4
5  25-34     40-79 0-9g/day      0        27     1
6  25-34     40-79    10-19      0         7     2
8  25-34     40-79      30+      0         7     3
7  25-34     40-79    20-29      0         4     4
9  25-34    80-119 0-9g/day      0         2     1
11 25-34    80-119      30+      0         2     2
...

如何计算此列?

谢谢!

【问题讨论】:

  • 某种类型的 thisthis 的欺骗以及大约 1MM 的类似问题
  • @DavidArenburg 在第一个中,在列标题中是 rank,在第二个中是 counter 而不是 count :-)

标签: r counting


【解决方案1】:

这是data.table 解决方案:

R> (data.table(Data)[,index := 1:.N, by = "agegp,alcgp"])
    agegp     alcgp    tobgp ncases ncontrols index
 1: 25-34 0-39g/day 0-9g/day      0        40     1
 2: 25-34 0-39g/day    10-19      0        10     2
 3: 25-34 0-39g/day    20-29      0         6     3
 4: 25-34 0-39g/day      30+      0         5     4
 5: 25-34     40-79 0-9g/day      0        27     1
 6: 25-34     40-79    10-19      0         7     2
 7: 25-34     40-79      30+      0         7     3
 8: 25-34     40-79    20-29      0         4     4
 9: 25-34    80-119 0-9g/day      0         2     1
10: 25-34    80-119      30+      0         2     2

library(data.table)
##
Data <- read.table(
  text = "   agegp     alcgp    tobgp ncases ncontrols
1  25-34 0-39g/day 0-9g/day      0        40
2  25-34 0-39g/day    10-19      0        10
3  25-34 0-39g/day    20-29      0         6
4  25-34 0-39g/day      30+      0         5
5  25-34     40-79 0-9g/day      0        27
6  25-34     40-79    10-19      0         7
8  25-34     40-79      30+      0         7
7  25-34     40-79    20-29      0         4
9  25-34    80-119 0-9g/day      0         2
11 25-34    80-119      30+      0         2",
  header = TRUE,
  stringsAsFactors = FALSE
)

【讨论】:

    【解决方案2】:

    这可以使用具有row_number()dplyr 等专用包来解决。我们需要按变量 ('alcgp') 分组并使用 mutate 创建一个新列。

    library(dplyr)
    df1 %>%
       group_by( alcgp) %>%
       mutate(indx= row_number())
    

    或者使用来自base Rave。我们按“alcgp”分组,在FUN 中我们可以指定seq_along。我使用了seq_along(alcgp),因为如果变量是factor 类,它可能不起作用。

     df1$indx <- with(df1, ave(seq_along(alcgp), alcgp, FUN=seq_along))
    

    splitstackshape 中的另一个方便功能,即getanID

     library(splitstackshape)
     getanID(df1, 'alcgp')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      相关资源
      最近更新 更多