【问题标题】:Merge two tables based on 2 conditions and output the average as result column根据 2 个条件合并两个表并将平均值作为结果列输出
【发布时间】:2018-11-18 07:01:26
【问题描述】:

我有以下两张表:

Table_1
    ID  Interval
    1   10
    1   11
    2   11

Table_2
   ID   Interval    Rating
    1   10          0.5
    1   10          0.3
    1   11          0.1
    2   11          0.1
    2   11          0.2

输出表应如下所示:

ID  Interval    Mean Ratings
1   10          0.4
1   11          0.1
2   11          0.15

我的目标是根据两个条件/列 ID 和间隔连接两个表。鉴于我对相同的 ID 和区间有多个评分,我想计算 评分的平均值。尽管 ID 是唯一的(~9500),但对于不同的 ID,间隔会重复(如上表所示)。我目前的方法是使用 2 by 参数的 join 函数。如何根据条件 ID 和区间创建 Table_1 和 Table_2 连接的最终表,并在结果列中接收平均评分?

left_join(Table_1, Table_2, by = c("ID" = "ID", "Interval" = "Interval"))

【问题讨论】:

  • 我会投反对票,但现在不要这样做。您问了一个问题,详细说明了解决方案的必要步骤 - 一个简单的谷歌会帮助您。关于 SO 的合并/总结有很多。
  • @Tjebo:OP 还需要一个 groupby-and-summarize 步骤。加入不会计算平均值。
  • @smci 同意,因此这不是一个完整的问题,而是两个很容易找到的独立问题。 PS 如果有人投了反对票 - 不是我。

标签: r join group-by dplyr summarize


【解决方案1】:

首先,您需要汇总第二个表DT2,然后与第一个表DT1 执行右连接。

library(data.table)

DT1[DT2[, .(Mean_Rating = mean(Rating)), .(ID, Interval)], on = c(ID = "ID", Interval = "Interval")]

给了

   ID Interval Mean_Rating
1:  1       10        0.40
2:  1       11        0.10
3:  2       11        0.15


样本数据:

DT1 <- structure(list(ID = c(1L, 1L, 2L), Interval = c(10L, 11L, 11L
)), .Names = c("ID", "Interval"), class = c("data.table", "data.frame"
), row.names = c(NA, -3L))

DT2 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L), Interval = c(10L, 
10L, 11L, 11L, 11L), Rating = c(0.5, 0.3, 0.1, 0.1, 0.2)), .Names = c("ID", 
"Interval", "Rating"), class = c("data.table", "data.frame"), row.names = c(NA, 
-5L))

【讨论】:

    【解决方案2】:

    您可以通过dplyrleft_joingroup_by 然后summarise 来实现它。

    library(dplyr)
    
    table1 %>% 
      left_join(table2, by = c("ID", "Interval")) %>% 
      group_by(ID, Interval) %>% 
      summarise("Mean Ratings" = mean(Rating))
    
    ## A tibble: 3 x 3
    ## Groups:   ID [?]
    #     ID Interval `Mean Ratings`
    #  <int>    <int>          <dbl>
    #1     1       10           0.4
    #2     1       11           0.1
    #3     2       11           0.15
    

    数据

    table1 <- read.table(header = T, text="ID  Interval
        1   10
        1   11
        2   11")
    
    table2 <- read.table(header = T, text = "ID Interval    Rating
            1   10          0.5
            1   10          0.3
            1   11          0.1
            2   11          0.1
            2   11          0.2")
    

    【讨论】:

      【解决方案3】:

      您不需要加入。相反,绑定您的表格并使用 dplyr 中的组和汇总。以下实现了您的要求:

      library(dplyr)
      
      table_1 <- data.frame("ID"= c(1,1,2),"Interval"=c (10,11,11),"Rating"= c(NA,NA,NA))
      table_2 <- data.frame("ID"= c(1,1,1,2,2),"Interval"= c(10,10,11,11,11),"Rating"= c(0.5,0.3,0.1,0.1,0.2))
      
      df1 <- bind_rows(table_1,table_2) %>% group_by(ID,Interval) %>% summarise("Mean Ratings" = mean(Rating,na.rm = TRUE))
      

      【讨论】:

      • 这是错误的。您需要在这里合并,因为如果在Table 2 中有ID = 3interval = whatever,那么您要合并所以ID = 3 不包含在分析中
      • 我无法理解您的评论。如果存在一组不需要的 ID,用户可以将它们过滤掉,例如过滤器(df1,ID %in% c(1,2))。
      • 用数千个 ID 尝试一下...这就是合并存在的原因。
      • @Sotos:谢谢你的评论。您能否提供实现所需输出的方法?
      • 其他两个答案中的任何一个都可以。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      相关资源
      最近更新 更多