我有两个数据框,如下所示。
dfu
是一种查找表,根据过去的研究显示每id
个属性的存在概率 - 存储为prop1
,prop2
等等。
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方法,欢迎其他方法。列数可能很多。
答案 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"))