【问题标题】:R data.table: How to sum variables by group based on a condition?R data.table:如何根据条件按组对变量求和?
【发布时间】:2017-08-14 17:31:59
【问题描述】:

假设我有以下 R data.table(尽管我很高兴使用基本 R 和 data.frame)

library(data.table)

dt = data.table(Category=c("First","First","First","Second","Third", "Third", "Second"), Frequency=c(10,15,5,2,14,20,3), times = c(0, 0, 0, 3, 3, 1))

> dt
   Category Frequency times
1:    First        10     0
2:    First        15     0
3:    First         5     0
4:   Second         2     3
5:    Third        14     3
6:    Third        20     1
7:   Second         3     0

如果我想按类别汇总频率,我会使用以下内容:

data[, sum(Frequency), by = Category]

但是,假设我想将FrequencyCategory 相加当且仅当times 非零且不等于NA

如何根据单独列的值将此总和设为条件?

编辑:为明显的问题道歉。快速补充:如果某个列的元素是字符串呢?

例如

> dt
   Category Frequency times
1:    First        ten    0
2:    First        ten    0
3:    First        five   0
4:   Second        five   3
5:    Third        five   3
6:    Third        five   1
7:   Second        ten    0

Sum() 不会计算 tenfive 的频率

【问题讨论】:

  • 好吧,显然,将您的条件放入 data.table 的 i 参数中。
  • 测试您的代码,这会引发警告。此外,显示所需的输出 - 不清楚您是否想要没有行满足条件的组。
  • 我认为在事后添加另一个问题是不正确的...而是为此打开一个新问题...但是您需要在执行任何操作之前将频率列转换为数字数学就可以了。这是一个例子:stackoverflow.com/questions/18332463/…

标签: r dataframe data.table aggregate


【解决方案1】:

记住data.table的逻辑:dt[i, j, by],即取dt,使用i子集行,然后计算jby分组。

dt[times != 0 & !is.na(times), sum(Frequency), by = Category]
   Category V1
1:   Second  2
2:    Third 34

【讨论】:

  • 对。现在这是有道理的。问题:如果列Frequency 有元素类型字符怎么办?
  • 那么你不能使用sum(),除非你先转换成数字。
【解决方案2】:

您可以使用括号子集来仅选择 times 具有非零和非 NA 值的行,然后运行您的分组操作。

dt[which(dt$times > 0)][, sum(Frequency), by = Category]

【讨论】:

  • 问题:如果频率列有元素类型字符怎么办?
  • @ShanZhengYang 您希望您的结果如何?
  • 我想我正在描述扩展这个data.table,这样每个分类变量都有一列以及与之相关的计数
  • 您可以将链的第一部分简化为dt[times > 0]
【解决方案3】:

您可以为此使用 rowsum()。

行和

根据分组变量给出矩阵或数据框的列总和

为分组变量的每个级别计算数值矩阵类对象的行的列总和。 rowsum 是通用的,有一个用于数据帧的方法和一个用于向量和矩阵的默认方法。

关键字:manip

用法

rowsum(x, group, reorder = TRUE, …)

data.frame 的 S3 方法

rowsum(x, group, reorder = TRUE, na.rm = FALSE, …)

默认的 S3 方法

rowsum(x, group, reorder = TRUE, na.rm = FALSE, …)

参数 矩阵、数据框或数值数据向量。允许缺失值。数值向量将被视为列向量。 组

a vector or factor giving the grouping, with one element per row of x. Missing values will be treated as another group and a warning will be given.

重新排序

if TRUE, then the result will be in order of sort(unique(group)), if FALSE, it will be in the order that groups were encountered.

na.rm

logical (TRUE or FALSE). Should NA (including NaN) values be discarded?

other arguments to be passed to or from methods

详情

默认设置是重新排序行以与 tapply 一致,如下例所示。除非 group 有很多不同的值并且 x 的列很少,否则重新排序不应显着增加时间。

最初的函数是由 Terry Therneau 编写的,但这是一个使用散列的新实现,对于大型矩阵来说要快得多。

要对矩阵的所有行(即单个组)求和,请使用 colSums,它应该更快。

对于整数参数,形成总和时的上溢/下溢导致 NA。

价值

包含总和的矩阵或数据框。每个唯一值将有一行

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 2021-06-17
    • 2014-09-30
    • 2021-02-11
    相关资源
    最近更新 更多