R 矢量化创建包含与分类变量对应的平均值的矢量
数据包含标签变量和数字x变量,然后我计算由labelmeans对象指定的组中x的平均值,然后我们将其用作字典,然后我想 创建包含与标签变量重复对应的平均值的新向量,以下示例使用,我不知道如何将其矢量化,唯一的可能性似乎是使用合并函数,问题是: 合并是否提供了矢量化的好处?我的原始数据集是否有数百万的观测值 如果没有,那么是否可以对y的创建进行矢量化 我目前的代码是:R 矢量化创建包含与分类变量对应的平均值的矢量,r,vectorization,R,Vectorization,数据包含标签变量和数字x变量,然后我计算由labelmeans对象指定的组中x的平均值,然后我们将其用作字典,然后我想 创建包含与标签变量重复对应的平均值的新向量,以下示例使用,我不知道如何将其矢量化,唯一的可能性似乎是使用合并函数,问题是: 合并是否提供了矢量化的好处?我的原始数据集是否有数百万的观测值 如果没有,那么是否可以对y的创建进行矢量化 我目前的代码是: set.seed(123) data<-data.frame(label=sample(c("A","B"),10,rep
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
使用data.table或dplyr包可以显著提高性能 或 或 若您只有两个标签,并且已经创建了means数据集,那个么可以使用索引在BaseR中对其进行完全矢量化
with(means, c(x[1], x[2]))[(data$label == "B") + 1]
作为旁注,您提到了使用data.table进行合并。您可以对聚合的数据进行非常有效的合并,所以让我们来说明一下您的平均数据
这意味着:通过标签将数据转换为data.table对象和键。在只拉取x列并更新y的同时,对means执行二进制连接
另一个选项是执行完全联接
setkey(setDT(means), label) ; setkey(setDT(data), label)
means[data]
使用data.table或dplyr包可以显著提高性能 或 或 若您只有两个标签,并且已经创建了means数据集,那个么可以使用索引在BaseR中对其进行完全矢量化
with(means, c(x[1], x[2]))[(data$label == "B") + 1]
作为旁注,您提到了使用data.table进行合并。您可以对聚合的数据进行非常有效的合并,所以让我们来说明一下您的平均数据
这意味着:通过标签将数据转换为data.table对象和键。在只拉取x列并更新y的同时,对means执行二进制连接
另一个选项是执行完全联接
setkey(setDT(means), label) ; setkey(setDT(data), label)
means[data]
您不需要先使用聚合,然后再使用for循环。直接使用ave即可:
data <- transform(data, y = ave(x, label, FUN = mean))
?ave允许您计算与“聚合”类似的“平均分组”函数,但不会将数据聚合到每组一行。这意味着在这种情况下,输出向量y的长度与输入向量x的长度相同。您不需要先使用聚合,然后再使用for循环。直接使用ave即可:
data <- transform(data, y = ave(x, label, FUN = mean))
?ave允许您计算与“聚合”类似的“平均分组”函数,但不会将数据聚合到每组一行。这意味着在这种情况下,输出向量y的长度与输入向量x的长度相同。我还有另外一个问题,上述方法是否适用于大规模数据集10E6观测?我正在使用ff包来处理它,现在看来我需要一些其他的方法来处理itdata。table是专门为处理庞大的数据集而设计的。试试看。我还有一个问题,上述方法是否适用于大规模数据集10E6观测?我正在使用ff包来处理它,现在看来我需要一些其他的方法来处理itdata。table是专门为处理庞大的数据集而设计的。试试看。它和使用data.table的过程一样快吗?@Qbik,不,你可以期望data.table比base R快很多,尤其是对于更大的数据集。它和使用data.table的过程一样快吗?@Qbik,不,你可以期望data.table比base R快很多,尤其是对于更大的数据集。
data <- transform(data, y = ave(x, label, FUN = mean))