Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于第二向量的子集和_R - Fatal编程技术网

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])