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

时间:2015-01-27 10:11:46

标签: r vectorization

Data包含label变量和数字x变量,然后我计算x指定的组中label的平均值(means创建了对象,然后我们将其用作字典),然后我想 创建包含重复与label变量对应的平均值的新向量,下面的示例使用for(),我看不出如何对其进行向量化,只有可能使用merge函数,问题是:

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

  2. 如果没有,那么可以向量化y的创建吗?

  3. 我目前的代码是:

    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
    

2 个答案:

答案 0 :(得分:5)

您可以使用data.tabledplyr个套件

显着提高效果
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)。