折叠包:对两个向量求和但保留空交点
collapse package: sum over two vectors but keep empty intersections
我想通过 collapse 包的 fsum 函数通过两个变量 a 和 b 聚合向量/矩阵 y。 fsum 不会 return 空交叉点的值。有没有办法使用 collapse 包来保持空交叉路口?我知道我可以,例如通过交叉连接和 data.table 工作,但由于我的函数输入是一个向量,速度非常重要,我想避免将输入矩阵转换为 data.table,然后将输出转换回矩阵/ 向量(对于 data.table 的解决方案,请参见此处的示例:)。
这是一个例子:
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.table
和 collapse
都明显更快,但是 collapse
的优点是它也适用于矩阵对象(不需要转换到 data.table's).
有办法通过崩溃实现吗?
是的,您可以使用 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))
就足够了。
我想通过 collapse 包的 fsum 函数通过两个变量 a 和 b 聚合向量/矩阵 y。 fsum 不会 return 空交叉点的值。有没有办法使用 collapse 包来保持空交叉路口?我知道我可以,例如通过交叉连接和 data.table 工作,但由于我的函数输入是一个向量,速度非常重要,我想避免将输入矩阵转换为 data.table,然后将输出转换回矩阵/ 向量(对于 data.table 的解决方案,请参见此处的示例:
这是一个例子:
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.table
和 collapse
都明显更快,但是 collapse
的优点是它也适用于矩阵对象(不需要转换到 data.table's).
有办法通过崩溃实现吗?
是的,您可以使用 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))
就足够了。