R 根据2个条件合并两个表,并将平均值作为结果列输出

R 根据2个条件合并两个表,并将平均值作为结果列输出,r,join,group-by,dplyr,summarize,R,Join,Group By,Dplyr,Summarize,我有以下两个表格: Table_1 ID Interval 1 10 1 11 2 11 及 输出表应如下所示: ID Interval Mean Ratings 1 10 0.4 1 11 0.1 2 11 0.15 我的目标是基于两个条件/列ID和interval连接这两个表。考虑到我对同一ID和时间间隔有多个评分,我想计算评分的平均值。虽然ID是唯一的(~9500),

我有以下两个表格:

Table_1
    ID  Interval
    1   10
    1   11
    2   11

输出表应如下所示:

ID  Interval    Mean Ratings
1   10          0.4
1   11          0.1
2   11          0.15
我的目标是基于两个条件/列ID和interval连接这两个表。考虑到我对同一ID和时间间隔有多个评分,我想计算评分的平均值。虽然ID是唯一的(~9500),但间隔会针对不同的ID重复(如上表所示)。我目前的方法是带有2个参数的联接函数。如何创建一个最终表格,其中表格_1和表格_2根据条件ID和时间间隔连接,并在结果列中接收平均评级

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

你不需要加入。相反,绑定表并使用dplyr中的group&summary。以下内容实现了您的要求:

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))
库(dplyr)

表1您不需要加入。相反,绑定表并使用dplyr中的group&summary。以下内容实现了您的要求:

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))
库(dplyr)

表1您可以通过
dplyr
left\u join
分组,然后
汇总来实现

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
库(dplyr)
表1%>%
左连接(表2,by=c(“ID”,“Interval”))%>%
分组依据(ID,间隔)%>%
总结(“平均评级”=平均(评级))
##一个tibble:3x3
##组:ID[?]
#ID间隔`平均评级`
#                
#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")

table1您可以通过
dplyr
left\u join
group\u by
,然后
总结来实现

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
库(dplyr)
表1%>%
左连接(表2,by=c(“ID”,“Interval”))%>%
分组依据(ID,间隔)%>%
总结(“平均评级”=平均(评级))
##一个tibble:3x3
##组:ID[?]
#ID间隔`平均评级`
#                
#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")

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

库(data.table)
DT1[DT2[,(平均值=平均值(评级)),(ID,区间)],on=c(ID=“ID”,区间=“区间”)]

   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))

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

库(data.table)
DT1[DT2[,(平均值=平均值(评级)),(ID,区间)],on=c(ID=“ID”,区间=“区间”)]

   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中
您有
ID=3
interval=which
,那么您需要合并,以便
ID=3
不包含在分析中。我无法理解您的注释。如果存在一组不需要的ID,则用户可以将其过滤掉,例如筛选(df1,ID%在%c(1,2)中)。使用数千个ID进行尝试。。。这就是合并存在的原因。@Sotos:谢谢你的评论。你能提供你实现期望输出的方法吗?其他两个答案中的任何一个都可以。这是错误的。您需要在此处合并,因为如果在
表2中
您有
ID=3
interval=which
,那么您需要合并,以便
ID=3
不包含在分析中。我无法理解您的注释。如果存在一组不需要的ID,则用户可以将其过滤掉,例如筛选(df1,ID%在%c(1,2)中)。使用数千个ID进行尝试。。。这就是合并存在的原因。@Sotos:谢谢你的评论。你能提供你实现期望结果的方法吗?其他两个答案中的任何一个都可以。可能重复的我会投反对票,但现在不要。你问了一个问题,详细说明了解决方案的必要步骤——一个简单的谷歌会对你有所帮助。关于合并/汇总的问题有很多。@Tjebo:OP还需要一个groupby和Summary步骤。Join不会计算平均值。@我同意,因此它不是一个完整的问题,而是两个很容易找到的独立问题。PS如果有人投了反对票,那不是我。我可能会投反对票,但现在不投了。你问了一个问题,详细说明了解决方案的必要步骤——一个简单的谷歌会对你有所帮助。关于合并/汇总的问题有很多。@Tjebo:OP还需要一个groupby和Summary步骤。Join不会计算平均值。@我同意,因此它不是一个完整的问题,而是两个很容易找到的独立问题。如果有人投了反对票,那不是我。