我有一个数据帧dfu
,它保存每个id
(id属于一个team
,team
有许多ids
)的百分比样本,其中一堆属性prop1
,prop2
等等是基于一些过去的研究观察到的 - 这被用作未来研究的参考表。现在有来自新实验的数据,它给出了一组新的ids
。我需要通过使用dfu
中的参考数据,找到每个team
观察prop1
、prop2
等的百分比样本。这可以通过计算dfi
中每id
的出现次数来完成,然后取按team
分组的加权平均值 - 并非dfu
中的所有 id 都可能存在,dfu
中可能存在一个或多个 IDdfi
中可能存在。dfu
中不存在的 ID 可能会从加权平均值中排除,因为每个属性值都没有可用的 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
输出格式如下所示。例如,组A
的prop1
值将为(0.8*1 + 0.5*1)/2 = 0.65
。
team prop1 prop2
A
B
C
首选基本 R 方法,欢迎其他方法。列数可能很多。
我不知道如何使用base R来做到这一点。
使用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
在 base R 中实现同样的事情。
从@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
使用mean
按team
聚合prop1
和prop2
> 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