Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 矢量化创建包含与分类变量对应的平均值的矢量_R_Vectorization - Fatal编程技术网

R 矢量化创建包含与分类变量对应的平均值的矢量

R 矢量化创建包含与分类变量对应的平均值的矢量,r,vectorization,R,Vectorization,数据包含标签变量和数字x变量,然后我计算由labelmeans对象指定的组中x的平均值,然后我们将其用作字典,然后我想 创建包含与标签变量重复对应的平均值的新向量,以下示例使用,我不知道如何将其矢量化,唯一的可能性似乎是使用合并函数,问题是: 合并是否提供了矢量化的好处?我的原始数据集是否有数百万的观测值 如果没有,那么是否可以对y的创建进行矢量化 我目前的代码是: set.seed(123) data<-data.frame(label=sample(c("A","B"),10,rep

数据包含标签变量和数字x变量,然后我计算由labelmeans对象指定的组中x的平均值,然后我们将其用作字典,然后我想 创建包含与标签变量重复对应的平均值的新向量,以下示例使用,我不知道如何将其矢量化,唯一的可能性似乎是使用合并函数,问题是:

合并是否提供了矢量化的好处?我的原始数据集是否有数百万的观测值

如果没有,那么是否可以对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

使用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))