【问题标题】:R Looping aggregate by group countR按组计数循环聚合
【发布时间】:2017-05-10 12:13:29
【问题描述】:

我想编写一个循环来聚合按年份分组的(某些值的)实例数。更具体地说,假设变量是x1。我想要两组,一组是x1 = 1,另一组是一些值的组合(下例中为 2,3 和 5):

year    x1
2000    1
2000    1
2000    2
2000    3
2000    5

最终结果应该是这样的:

year    x2    x3
2000    2     3

其中x2x3 分别是x1 = 1 和x1 = c(2,3,5) 时的计数。如何做到这一点?

编辑:可能应该在前面提到这一点。我使用两个数据集;一个df1 是每年一次(跨越大约200 年),另一个df2 是基于事件的(大约50k 次观测;这是x1 当前所在的位置)。所以循环的想法是查看df2 中的每一年[i],并通过在df1 中将它们分组为x2x3 来聚合计数。

Edit2:啊,我解决了为什么提交的答案对我不起作用。显然我在这个answer 中讨论的plyr 问题之前遇到了dplyr;我按照 ManneR 的回答和分离 plyr。现在group_by 命令又可以工作了。

【问题讨论】:

  • 一个群体与另一个群体的区别是什么?
  • 测量同一个现象的三个变量,都是数值型的。但是,我只想区分某些类别。如果有帮助,第一组 (x2) 始终是标量,而第二组 (x3) 始终是多个类别的聚合计数。

标签: r count dplyr aggregate


【解决方案1】:

假设您从一个名为 df 的数据框开始,这将按您描述的年份计算案例:

library(dplyr)
df %>% group_by(year) %>% summarise(x2 = sum(x1==1), x3 = sum(x1 %in% c(2,3,5)))

【讨论】:

  • 感谢您的输入,我通过编辑问题澄清了我需要什么。你能让它工作以适用于我的问题吗?
【解决方案2】:

我不确定 user3349904 的回答有什么问题,因为它似乎符合您的要求。在不知道您的数据是什么样子的情况下准确地知道您的要求是不容易的。如果您因为 df1 需要保存 x2 和 x3 值而对其他解决方案有疑问?最后一部分将解决这个问题。

我试图从头开始复制您的问题,所以这是我的解决方案。

library(dplyr)

#create DF1 (years)
df1 <- as.data.frame(matrix(ncol=3,nrow = 200))
df1$V1 <- c(1800:1999)
colnames(df1) <- c("year","x2","x3")

#create DF2 (transactions)
df2 <- as.data.frame(matrix(ncol=2,nrow=50000))
#add random sample data
df2$V1 <- sample(1800:1999,50000,replace = T)
df2$V2 <- sample(1:5,5000,replace = T)
colnames(df2) <- c("year","x1")

# group by year in df2 and aggregate counts based on categories
df2 %>% group_by(year) %>%
   summarise(x2 = sum(x1==1), x3 = sum(x1 %in% c(2,3,5))) -> df3

# match years in df3 and df1 and bring lookup value to df1
df1$x2 <- df3$x2[match(df1$year,df3$year)]
df1$x3 <- df3$x3[match(df1$year,df3$year)]

【讨论】:

  • 我对原始问题进行了另一次编辑,group_by 命令不起作用,所以我不断收到包含单个观察的df3。在修复包加载顺序后,您的代码现在可以执行我想要的操作。
【解决方案3】:

这是另一个使用dplyr/tidyr的选项

library(dplyr)
library(tidyr)
df1 %>%
    group_by(year, grp = paste0("x", (x1 != 1) + 2)) %>%
    summarise(x1= n()) %>% 
    spread(grp, x1)
#   year    x2    x3
#* <int> <int> <int>
#1  2000     2     3

或使用base R

xtabs(Freq~year + x1, transform(df1, x1= paste0("x", (x1!=1)+2), Freq= 1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2014-09-19
    • 2021-08-19
    • 2019-04-24
    相关资源
    最近更新 更多