矢量化包含与分类变量对应的装置的矢量的创建

Qbi*_*bik 1 r vectorization

Data包含label变量和数字x变量,然后我计算xlabel(由means对象创建然后我们用作字典)指定的组的平均值,然后我想创建包含重复与label变量对应的平均值的新向量,下面的示例使用for(),I看不出我怎么能把它矢量化,唯一的可能就是使用merge函数,问题是:

  1. 是否merge提供了矢量化的好处(我的原始数据集,有几百万的观察结果)?

  2. 如果没有,那么是否可以矢量化创建y

我目前的代码是:

set.seed(123)

data<-data.frame(label=sample(c("A","B"),10,replace=TRUE),x=rnorm(10))
data
#   label          x
#1      A  1.7150650
#2      B  0.4609162
#3      A -1.2650612
#4      B -0.6868529
#5      B -0.4456620
#6      A  1.2240818
#7      B  0.3598138
#8      B  0.4007715
#9      B  0.1106827
#10     A -0.5558411


means<-aggregate(formula = x~label, data = data, FUN = mean)
means
#  label          x
#1     A 0.27956110
#2     B 0.03327823

for(i in 1:10){
 y[i]=means[which(means[,1]==data[i,1]),2]
}

data<-data.frame(data, y)
data
#   label          x          y
#1      A  1.7150650 0.27956110
#2      B  0.4609162 0.03327823
#3      A -1.2650612 0.27956110
#4      B -0.6868529 0.03327823
#5      B -0.4456620 0.03327823
#6      A  1.2240818 0.27956110
#7      B  0.3598138 0.03327823
#8      B  0.4007715 0.03327823
#9      B  0.1106827 0.03327823
#10     A -0.5558411 0.27956110
Run Code Online (Sandbox Code Playgroud)

Dav*_*urg 5

您可以使用data.tabledplyr包显着提高性能

library(data.table)
setDT(data)[, y := mean(x), label]
Run Code Online (Sandbox Code Playgroud)

要么

library(dplyr)
data %>% 
  group_by(label) %>%
  mutate(y = mean(x))
Run Code Online (Sandbox Code Playgroud)

要么

如果您只有两个标签并且已经创建了means数据集,则可以使用索引在基本R中完全向量化它

with(means, c(x[1], x[2]))[(data$label == "B") + 1]
Run Code Online (Sandbox Code Playgroud)

作为旁注,您提到了这merge一点,data.table您可以对聚合数据进行非常有效的合并,因此请举例说明您的means数据

means <- aggregate(x ~ label, data, mean)
Run Code Online (Sandbox Code Playgroud)

然后你就可以做到

setkey(setDT(data), label)[means, y := i.x]
Run Code Online (Sandbox Code Playgroud)

这意味着:转换datadata.table对象和键label.执行二进制连接,means同时仅拉动x列并进行更新y


另一种选择是执行完全连接

setkey(setDT(means), label) ; setkey(setDT(data), label)
means[data]
Run Code Online (Sandbox Code Playgroud)