将分配应用于新样本集

时间:2017-02-15 06:53:37

标签: r

我有一个数据框dfu,其中包含每个id(ID属于一个teamteam有多个ids个百分比样本根据一些过去的研究,观察到一堆属性prop1prop2等等 - 这被用作未来研究的参考表。现在有来自新实验的数据,它提供了一组新的ids。我需要使用prop1中的参考数据找到prop2team等基于每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方法,欢迎其他方法。列数可能很多。

2 个答案:

答案 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

prop1prop2 teammean汇总> 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}}