R 基于第二向量的子集和
我得到了两个向量:R 基于第二向量的子集和,r,R,我得到了两个向量: a <- c(1,1,2,3,4,4,4,4,5,6) b <- c(T,F,T,F,T,T,F,F,F,T) 我能想到的最好办法就是使用sapply: sapply(unique(a), FUN = function(uniqueA, a, b) sum(b[a == uniqueA]), a = a, b = b) 这很好,但对于较大的向量,速度相当慢。(我尝试了一些子集变体。) a您可以使用aggregate: aggregate(b, list(a),
a <- c(1,1,2,3,4,4,4,4,5,6)
b <- c(T,F,T,F,T,T,F,F,F,T)
我能想到的最好办法就是使用sapply:
sapply(unique(a), FUN = function(uniqueA, a, b) sum(b[a == uniqueA]), a = a, b = b)
这很好,但对于较大的向量,速度相当慢。(我尝试了一些子集变体。)
a您可以使用aggregate
:
aggregate(b, list(a), sum)
为了获得最快的性能,我建议使用data.table
。设置需要更长的时间,但对于较大的数据量,性能应该相当好
library(data.table)
dt <- data.table(a = a, b = b)
dt[,sum(b), by = a]
库(data.table)
dt您可以使用aggregate
:
aggregate(b, list(a), sum)
为了获得最快的性能,我建议使用data.table
。设置需要更长的时间,但对于较大的数据量,性能应该相当好
library(data.table)
dt <- data.table(a = a, b = b)
dt[,sum(b), by = a]
库(data.table)
dt这一个可能使用以R为底的表
:
t <- table(a[b])
z <- as.numeric(names(t))
rbind(unname(cbind(z, t)), cbind(setdiff(unique(a),z),0))
# [,1] [,2]
# [1,] 1 1
# [2,] 2 1
# [3,] 4 2
# [4,] 6 1
# [5,] 3 0
# [6,] 5 0
t这一个可能使用R基中的表
:
t <- table(a[b])
z <- as.numeric(names(t))
rbind(unname(cbind(z, t)), cbind(setdiff(unique(a),z),0))
# [,1] [,2]
# [1,] 1 1
# [2,] 2 1
# [3,] 4 2
# [4,] 6 1
# [5,] 3 0
# [6,] 5 0
t或者我们可以使用tidyverse
library(tidyverse)
tibble(a, b) %>%
group_by(a) %>%
summarise(b = sum(b))
一个基本的R选项是
rowsum(+b, a)
或者我们可以使用tidyverse
library(tidyverse)
tibble(a, b) %>%
group_by(a) %>%
summarise(b = sum(b))
一个基本的R选项是
rowsum(+b, a)
tapply(b,a,sum)
?tapply(b,a,sum)
?非常感谢。这是相当大的性能提升data.table
对我来说不是一个好办法,因为我想在函数中使用它,不想强制使用这个包。非常感谢。这是相当大的性能提升data.table
对我来说不是一个好办法,因为我想在函数中使用它,不想强制使用包。rowsum变量实际上非常好,因为我只需要向量而不需要矩阵。(抱歉,问错了问题。)“+”有什么作用?@Georgery输出矩阵可以强制为向量,即c(行和(+b,a))
是的,我知道。谢谢但是+
-它做了什么?@Georgery行和
没有将逻辑向量作为参数,因此我们必须将它强制为整数。您可以使用+
转换为二进制,或者使用as.integer
包装,即行和(as.integer(b),a)
行和变量实际上非常好,因为我只需要向量,不需要矩阵。(抱歉,问错了问题。)“+”有什么作用?@Georgery输出矩阵可以强制为向量,即c(行和(+b,a))
是的,我知道。谢谢但是+
-它做了什么?@Georgery行和
没有将逻辑向量作为参数,因此我们必须将它强制为整数。您可以使用+
转换为二进制,或者使用as.integer
换行,即行和(as.integer(b),a)
稍微短一点cbind(unique(sort(a)),table(a,b)[,2])
。稍微短一点cbind(unique(sort(A)),table(A,b)[,2])
。