我有一个数据框dfu
,其中包含每个id
(ID属于一个team
,team
有多个ids
个百分比样本根据一些过去的研究,观察到一堆属性prop1
,prop2
等等 - 这被用作未来研究的参考表。现在有来自新实验的数据,它提供了一组新的ids
。我需要使用prop1
中的参考数据找到prop2
,team
等基于每dfu
观察的百分比样本。这可以通过计算id
中每dfi
个出现次数来计算,然后按team
分组加权平均值.-并非所有dfu
中的ID都可能存在且dfu
中可能存在dfi
中不存在的一个或多个ID。 dfu
中不存在的ID可能会从加权平均值中排除,因为每个属性值都不存在。
dfu <- data.frame(id=1:6, team=c('A',"B","C","A","A","C"), prop1=c(0.8,0.9,0.6,0.5,0.8,0.9), prop2=c(0.2,0.3,.3,.2,.2,.3))
> dfu
id team prop1 prop2
1 A 0.8 0.2
2 B 0.9 0.3
3 C 0.6 0.3
4 A 0.5 0.2
5 A 0.8 0.2
6 C 0.9 0.3
>
> dfi <- data.frame(id=c(2 , 3 , 2 , 1 , 4 , 3 , 7))
> dfi
id
2
3
2
1
4
3
7
输出格式如下所示。例如,组prop1
的{{1}}值为A
。
(0.8*1 + 0.5*1)/2 = 0.65
更喜欢基地R方法,欢迎其他方法。列数可能很多。
答案 0 :(得分:1)
我不确切知道如何用基础R来做。
使用data.table,它应该非常简单。 将data.frames转换为data.table。
library(data.table)
dfu <- data.frame(id=1:6, team=c('A',"B","C","A","A","C"), prop1=c(0.8,0.9,0.6,0.5,0.8,0.9), prop2=c(0.2,0.3,.3,.2,.2,.3))
dfi <- data.frame(id=c(2 , 3 , 2 , 1 , 4 , 3 , 7))
dfi <- data.table(dfi)
dfu <- data.table(dfu)
然后将它们合并为
dfu[dfi,on="id"]
## > dfu[dfi,on="id"]
## id team prop1 prop2
## 1: 2 B 0.9 0.3
## 2: 3 C 0.6 0.3
## 3: 2 B 0.9 0.3
## 4: 1 A 0.8 0.2
## 5: 4 A 0.5 0.2
## 6: 3 C 0.6 0.3
## 7: 7 NA NA NA
然后我们只需要按组执行平均值。事实上,我们可以像
一样使用它 dfu[dfi,on="id"][,mean(prop1),team]
## > dfu[dfi,on="id"][,mean(prop1),team]
## team V1
## 1: B 0.90
## 2: C 0.60
## 3: A 0.65
## 4: NA NA
你可以通过合并data.frame并使用函数aggregate
在基础R中实现相同的功能。
答案 1 :(得分:1)
从@ DJJ的答案中获取提示。
dfu <- data.frame(id=1:6, team=c('A',"B","C","A","A","C"),
prop1=c(0.8,0.9,0.6,0.5,0.8,0.9),
prop2=c(0.2,0.3,.3,.2,.2,.3))
dfi <- data.frame(id=c(2 , 3 , 2 , 1 , 4 , 3 , 7))
按ID合并
> dfx <- merge(dfi, dfu, by="id")
> dfx
id team prop1 prop2
1 1 A 0.8 0.2
2 2 B 0.9 0.3
3 2 B 0.9 0.3
4 3 C 0.6 0.3
5 3 C 0.6 0.3
6 4 A 0.5 0.2
prop1
与prop2
team
和mean
汇总> aggregate(cbind(prop1, prop2) ~ team, dfx, mean)
team prop1 prop2
1 A 0.65 0.2
2 B 0.90 0.3
3 C 0.60 0.3
{{1}}