首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算每一行和每组的平均差

计算每一行和每组的平均差
EN

Stack Overflow用户
提问于 2016-05-14 13:26:04
回答 2查看 1.1K关注 0票数 1

我有一个包含许多行和列的data.frame,我希望计算每个值与组内其他每个值的平均值差异。

这里有一个例子:

代码语言:javascript
运行
复制
 ID  value 
 1    4 
 1    5 
 1    7 
 2    8 
 2    6 
 2    5 
 2    6

这就是我想计算的:

代码语言:javascript
运行
复制
ID  value  value_mean_diff 
 1    4     (4-5)^2 + (4-7)^2 /groupsize = 3
 1    5     (5-4)^2 + (5-7)^2 / 3
 1    7     (7-4)^2 + (7-5)^2 / 3
 2    8     (8-6)^2 + (8-5)^2 + (8-6)^2 / 4
 2    6     (6-8)^2 + (6-5)^2 + (6-6)^2 / 4
 2    5     (5-8)^2 + (5-6)^2 + (5-6)^2 / 4
 2    6     (6-8)^2 + (6-6)^2 + (6-5)^2 / 4 

我试过使用聚合(),但未能使它工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-14 13:57:36

一种在crossjoin库中使用data.table的解决方案,它存在从原始数据帧中删除重复行的缺陷:

代码语言:javascript
运行
复制
> dt <- setDT(df)[,setNames(CJ(value, value), c("value", "value1")), .(ID)][,.(value_mean_diff = sum((value-value1)^2)/.N),.(ID, value)]
> dt
   ID value value_mean_diff
1:  1     4        3.333333
2:  1     5        1.666667
3:  1     7        4.333333
4:  2     5        2.750000
5:  2     6        1.250000
6:  2     8        4.250000

由于复制的行总是具有相同的value_mean_diff,所以始终可以合并它们以获得所有重复的行。

代码语言:javascript
运行
复制
> merge(dt, df, by = c("ID", "value"))
   ID value value_mean_diff
1:  1     4        3.333333
2:  1     5        1.666667
3:  1     7        4.333333
4:  2     5        2.750000
5:  2     6        1.250000
6:  2     6        1.250000
7:  2     8        4.250000

Update:由于上面的方法是内存密集型的,所以您可以利用value_mean_diff = (value - value_mean)^2 +方差(value-value_mean)这一事实,这可以通过根据其定义扩展方差来证明。有了这一事实,您可以通过以下方式进行计算:

代码语言:javascript
运行
复制
> setDT(df)[, value_mean_diff := (value - mean(value))^2 + var(value) * (.N - 1) / .N, .(ID)]
> df
   ID value value_mean_diff
1:  1     4        3.333333
2:  1     5        1.666667
3:  1     7        4.333333
4:  2     8        4.250000
5:  2     6        1.250000
6:  2     5        2.750000
7:  2     6        1.250000

请记住,R中的var()函数计算样本方差,因此需要通过乘以因子(n-1)/n将其转换为总体方差。

票数 1
EN

Stack Overflow用户

发布于 2016-05-14 14:41:08

下面是一个只使用基本R的解决方案:

代码语言:javascript
运行
复制
myData <- data.frame(ID=c(1,1,1,2,2,2,2), value=c(4,5,7,8,6,5,6), diff=NA)
for(i in 1:nrow(myData))
    myData$diff[i] <- with(data = myData,
        sum((value[i] - value[ID==ID[i]])**2)/length(value[ID==ID[i]]))

myData

  ID value     diff
1  1     4 3.333333
2  1     5 1.666667
3  1     7 4.333333
4  2     8 4.250000
5  2     6 1.250000
6  2     5 2.750000
7  2     6 1.250000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37227238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档