Data
包含label
变量和数字x
变量,然后我计算x
指定的组中label
的平均值(means
创建了对象,然后我们将其用作字典),然后我想
创建包含重复与label
变量对应的平均值的新向量,下面的示例使用for()
,我看不出如何对其进行向量化,只有可能使用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
答案 0 :(得分:5)
您可以使用data.table
或dplyr
个套件
library(data.table)
setDT(data)[, y := mean(x), label]
或者
library(dplyr)
data %>%
group_by(label) %>%
mutate(y = mean(x))
或者
如果您只有 两个标签而已创建means
数据集,则可以使用索引在基础R中完全向量化
with(means, c(x[1], x[2]))[(data$label == "B") + 1]
作为旁注,您提到merge
,因此使用data.table
可以对汇总数据进行非常有效的合并,因此请举例说明means
数据
means <- aggregate(x ~ label, data, mean)
然后你可以简单地做
setkey(setDT(data), label)[means, y := i.x]
这意味着:将data
转换为data.table
对象并按label
键。在means
上执行二进制连接,同时仅提取x
列并更新y
另一种选择是执行完整连接
setkey(setDT(means), label) ; setkey(setDT(data), label)
means[data]
答案 1 :(得分:3)
您不需要先使用aggregate
,然后再使用for
循环。只需直接使用ave
:
data <- transform(data, y = ave(x, label, FUN = mean))
?ave
允许您按组计算mean
之类的函数(类似于aggregate
),但不会将数据聚合到每组一行。这意味着输出向量的长度(y
)与输入向量的长度相同(在这种情况下为x
)。