【问题标题】:collapse package: sum over two vectors but keep empty intersections折叠包:对两个向量求和,但保留空交叉点
【发布时间】:2021-03-05 13:24:17
【问题描述】:

我想通过 collapse 包的 fsum 函数通过两个变量 a 和 b 聚合一个向量/矩阵 y。 fsum 不返回空交叉点的值。有没有办法使用折叠包保持空的交叉点?我知道我可以例如通过交叉连接和data.table工作,但由于我的函数输入是一个向量并且速度真的很重要,我想避免将输入矩阵转换为data.table,然后将输出转换回矩阵/向量(对于带有 data.table 的解决方案,请参见此处:data.table calculate sums by two variables and add observations for "empty" groups)。

这是一个例子:

library(collapse)

set.seed(1)
a <- sample(1:5, 10, replace = TRUE)
b <- sample(1:3, 10, replace = TRUE)
y <- matrix(rnorm(10), 10, 1)

fsum(x = y, g = data.frame(a = a, b = b))
#> fsum(x = y, g = data.frame(a = a, b = b))
#           [,1]
#1.1 -0.40955189
#1.2 -0.05710677
#2.2  0.50360797
#2.3 -1.28459935
#3.1  0.04672617
#3.2 -0.69095384
#3.3 -0.23570656
#4.1  0.80418951
#5.2  1.08576936

我想得到什么:上面的常规输出,但保留 (a, b) 的空交叉点 - 例如 (a = 1, b = 3) 并分配缺失或零:

#   a b          y
#1: 1 1 -0.7702614
#2: 1 2 -0.2992151
#3: 1 3         NA
#4: 2 1         NA
#5: 2 2 -0.4115108
#6: 2 3  0.4356833
#.................

作为补充:base::aggregate() 有一个函数参数drop = FALSE 可以实现这一点:

aggregate(y, data.frame(a, b), sum, drop = FALSE)
  a b         V1
#1  1 1 -0.7702614
#2  2 1         NA
#3  3 1 -1.2375384
#4  4 1 -0.2894616
#5  5 1         NA
#6  1 2 -0.2992151
#7  2 2 -0.4115108
#8  3 2 -0.8919211
#9  4 2         NA
#10 5 2  0.2522234
#11 1 3         NA
#12 2 3  0.4356833
#13 3 3 -0.2242679
#14 4 3         NA
#15 5 3         NA

尽管如此,根据我的经验,data.tablecollapse 都快得多,但collapse 的优势在于它也适用于矩阵对象(不需要转换为 data.table 的)。

有没有办法通过折叠来实现这一点?

【问题讨论】:

  • 你想要一个 data.frame 作为输出??
  • 理想情况下,我想要一个尺寸为 length(unique(a)) 和 length(unique(b)) 作为输出的矩阵。
  • 一种方法是通过 expand.grid 或 data.table::CJ 创建所有组,然后进行左连接。但我不认为这对你来说是一个令人满意的解决方案

标签: r collapse


【解决方案1】:

是的,您可以使用 fsum 执行此操作,但其他函数(如 fmedian)会对此发出警告。为此,您需要创建因子并使用: 与它们交互,如下所示:

library(collapse)

set.seed(1)
a <- sample(1:5, 10, replace = TRUE)
b <- sample(1:3, 10, replace = TRUE)
y <- matrix(rnorm(10), 10, 1)

fsum(x = y, g = qF(a):qF(b))
# [,1]
# 1:1 -0.7702614
# 1:2 -0.2992151
# 1:3         NA
# 2:1         NA
# 2:2 -0.4115108
# 2:3  0.4356833
# 3:1 -1.2375384
# 3:2 -0.8919211
# 3:3 -0.2242679
# 4:1 -0.2894616
# 4:2         NA
# 4:3         NA
# 5:1         NA
# 5:2  0.2522234
# 5:3         NA

对于您之前给出的示例,我还想指出,对data.frame 的昂贵调用绝对没有必要,fsum(x = y, g = list(a = a, b = b)) 就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2018-01-21
    • 2020-12-10
    • 2018-01-15
    • 2014-09-03
    相关资源
    最近更新 更多