【问题标题】:Aggregation of dataframe by lookup in another dataframe通过在另一个数据帧中查找来聚合数据帧
【发布时间】:2017-02-08 05:17:01
【问题描述】:

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

dfu 是一个查找表,用于查找基于过去研究的每个id 的属性存在概率 - 存储为prop1prop2 等等。 dfi 包含在实验中发现的一堆 id - 并非dfu 中的所有 id 都可能存在,dfu 中不存在的一个或多个 id 可能存在于 dfi

> 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 人口的每个属性的存在。这可以通过计算dfi 中每个id 的出现次数来完成,然后对每个属性进行加权平均。 dfu 中不存在的 id 可能会从加权平均值中排除,因为它们没有可用的每个属性值。

所以对于prop1,它就像(0.8*1 + 0.4*3 + 0.6*2)/(1 + 3 + 2) = 0.53 - 这里使用的1,3,2 分别是在dfi 中出现的id 1、2 和3。

输出如下所示

prop1   prop2
0.5333     0.5167

首选基本 R 方法,欢迎使用其他方法。列数可能很多。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用基础 R apply 列 - 明智地计算 dfu 中每一列的加权平均值。

    apply(dfu[-1], 2, function(x) weighted.mean(x[match(dfi$id, dfu$id)]))
    
    #prop1     prop2 
    #0.5333333 0.5166667 
    

    编辑

    根据编辑,如果 dfi 中存在 iddfu 中不存在的情况,我们可以使用带有 nomatch 参数的答案

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

    【讨论】:

    • @akrun 你能告诉我怎么做吗?并且无需复制“不正确”的方法。
    • 可以查看OP的输入数据
    • 我复制了什么?我有一种使用data.table 的方法。 weighted.mean 没有你的专利
    • @RonakShah - 当dfi 仅包含ids 存在于dfu 时,此答案效果很好。但是,如果 dfi 包含 id 不存在于 dfu 中,它会给出加权平均值。作为 NAs
    • @user3206440 只需使用nomatch 参数更新即可。见答案。
    【解决方案2】:

    我们可以使用data.table。将“data.frame”转换为“data.table”(setDT(dfu)),与“dfi”on“id”列进行连接,遍历.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
    

    如果我们在“dfi”中有元素不在“dfu”中,请使用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"))
    

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2018-03-04
      相关资源
      最近更新 更多