通过在另一个数据帧中查找来聚合数据帧

时间:2017-02-08 05:17:01

标签: r

我有两个数据框,如下所示。

dfu是一种查找表,根据过去的研究显示每id个属性的存在概率 - 存储为prop1prop2等等。 dfi包含在实验中找到的一堆ID - 并非dfu中的所有ID都可能存在,并且dfu中可能存在dfi中不存在的一个或多个ID / p>

> set.seed(100)
> dfu <- data.frame(id=rep(1:6,1, replace = FALSE), prop1=sample(0:10 / 10,6, replace=TRUE), prop2=sample(0:10 / 10,6 , replace = TRUE) )
> dfu
  id prop1 prop2
1  1   0.8   0.3
2  2   0.4   0.4
3  3   0.6   0.8
4  4   0.1   0.7
5  5   0.6   0.2
6  6   0.9   0.3
> dfi <- data.frame(id = c(sample(1:3, 6, replace = TRUE),7))
> dfi
  id
1  2
2  3
3  2
4  1
5  2
6  3
7  7

使用dfu,给定dfi我需要根据每个属性计算dfi中所有ID的每个属性的存在性。这可以通过计算id中每dfi个出现次数,然后对每个属性进行加权平均来完成。 dfu中不存在的ID可能会从加权平均值中排除,因为每个属性值都不存在。

因此对于prop1来说,它就像(0.8*1 + 0.4*3 + 0.6*2)/(1 + 3 + 2) = 0.53 - 这里使用的1,3,2是ids 1,2和&amp;的出现。 3分别在dfi

输出如下

prop1   prop2
0.5333     0.5167

更喜欢基地R方法,欢迎其他方法。列数可能很多。

2 个答案:

答案 0 :(得分:4)

我们可以使用基数R apply列来计算dfu中每列的加权平均值。

apply(dfu[-1], 2, function(x) weighted.mean(x[match(dfi$id, dfu$id)]))

#prop1     prop2 
#0.5333333 0.5166667 

修改

根据编辑,如果id中有dfi dfu的{​​{1}}中没有nomatch,我们可以使用apply(dfu[-1], 2, function(x) weighted.mean(x[match(dfi$id, dfu$id, nomatch = 0)])) 参数的答案

<form  name="form1" novalidate ng-submit="data.submitTheForm()">
<input type="text" placeholder="Type Here" name="inputName"  ng-model="data.inputName" required="required" pattern="^((?!_)[A-Z a-z0-9])+$" maxlength="20"/></form>

答案 1 :(得分:1)

我们可以使用data.table。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(dfu)),与&#39; dfi&#39;加入on {id}&#39;}列,循环遍历.SDcols中提到的列并获取weighted.mean

library(data.table)
setDT(dfu)[dfi, lapply(.SD, weighted.mean) ,on = .(id), .SDcols = prop1:prop2]
#      prop1     prop2
#1: 0.5333333 0.5166667

如果我们在&#39; dfi&#39;不在&#39; dfu&#39;中,请使用nomatch = 0

setDT(dfu)[dfi, lapply(.SD, weighted.mean) ,on = .(id), nomatch = 0, .SDcols = prop1:prop2]

数据

dfu <- structure(list(id = 1:6, prop1 = c(0.8, 0.4, 0.6, 0.1, 0.6, 0.9
), prop2 = c(0.3, 0.4, 0.8, 0.7, 0.2, 0.3)), .Names = c("id", 
"prop1", "prop2"), class = "data.frame", row.names = c(NA, -6L
))

dfi <- structure(list(id = c(2L, 3L, 2L, 1L, 2L, 3L)), .Names = "id", 
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6"))