【问题标题】:aggregate over several variables in r聚合 r 中的多个变量
【发布时间】:2010-05-11 21:24:34
【问题描述】:

我有一个相当大的长格式数据集,由于两个不同的变量 A 和 B,我需要计算 ID 实例的数量。例如由于A或B,同一个人可以在多行中表示。我需要做的是计算ID的实例数,这不是太难,而且还要计算由于A和B导致的ID数并返回这些作为数据集中的变量。

问候,

//米

【问题讨论】:

  • 请列出假设数据集的一些代表性行以及您希望从这些行中获得的具体结果。这个问题有多种解释。
  • 正如约翰所说,放一个样本数据,这样我们就可以玩弄它了。我仍然没有很好地得到消息,但which 可以是一个选择的函数,我想......

标签: r aggregate reshape


【解决方案1】:

plyr 包中的 ddply() 函数允许您通过标识符变量将数据分开,对每个块执行一个函数,然后将它们全部组合在一起。因此,您需要按标识符和 A/B 状态拆分数据,计算每种组合出现的次数(使用 nrow()),然后将这些计数很好地组合在一起。

使用 wkmor1 的df:

library(plyr)

x <- ddply(.data = df, .var = c("ID", "GRP"), .fun = nrow)

返回:

  ID GRP V1
1  1   a  2
2  1   b  2
3  2   a  2
4  2   b  2

然后将其合并回原始数据:

merge(x, df, by = c("ID", "GRP"))

【讨论】:

  • ...如果你要投反对票,你能至少提一下为什么吗?
【解决方案2】:

好的,鉴于我看到的解释,那么最快和最简单的解决方案是......

df$IDCount <- ave(df$ID, df$group, FUN = length)

【讨论】:

    【解决方案3】:

    这是一种方法,使用“表”来计算符合条件的行,并使用“合并”将频率添加回数据框。

    > df<-data.frame(ID=rep(c(1,2),4),GRP=rep(c("a","a","b","b"),2))
    > id.frq <- as.data.frame(table(df$ID))
    > colnames(id.frq) <- c('ID','ID.FREQ')
    > df <- merge(df,id.frq)
    > grp.frq <- as.data.frame(table(df$ID,df$GRP))
    > colnames(grp.frq) <- c('ID','GRP','GRP.FREQ')
    > df <- merge(df,grp.frq)
    > df
      ID GRP ID.FREQ GRP.FREQ
    1  1   a       4        2
    2  1   a       4        2
    3  1   b       4        2
    4  1   b       4        2
    5  2   a       4        2
    6  2   a       4        2
    7  2   b       4        2
    8  2   b       4        2
    

    【讨论】:

    • 不完全确定“将这些作为数据集中的变量返回”是什么意思,但我尽我所能解释它。
    • ...是的,直到我看到你的,我才知道这一点。
    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多