Data包含label变量和数字x变量,然后我计算x由label(由means对象创建然后我们用作字典)指定的组的平均值,然后我想创建包含重复与label变量对应的平均值的新向量,下面的示例使用for(),I看不出我怎么能把它矢量化,唯一的可能就是使用merge函数,问题是:
是否merge提供了矢量化的好处(我的原始数据集,有几百万的观察结果)?
如果没有,那么是否可以矢量化创建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)
您可以使用data.table或dplyr包显着提高性能
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)
这意味着:转换data为data.table对象和键label.执行二进制连接,means同时仅拉动x列并进行更新y
另一种选择是执行完全连接
setkey(setDT(means), label) ; setkey(setDT(data), label)
means[data]
Run Code Online (Sandbox Code Playgroud)