Объедините две таблицы на основе двух условий и выведите среднее значение в виде столбца результата. - PullRequest
0 голосов
/ 08 июня 2018

У меня есть следующие две таблицы:

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

Моя цель состоит в том, чтобыобъедините обе таблицы на основе двух идентификаторов условий / столбцов и интервала.Учитывая, что у меня есть несколько оценок для одного и того же идентификатора и интервала, я хочу вычислить среднее значение для оценок .В то время как идентификаторы уникальны (~ 9500), интервал повторяется для разных идентификаторов (как видно из таблицы выше).Мой текущий подход - функция соединения с двумя аргументами.Как создать итоговую таблицу, в которой таблицы Table_1 и Table_2 объединены на основе идентификатора условия и интервала, и получить среднюю оценку в столбце результатов?

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

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Вы можете достичь этого с помощью dplyr left_join, group_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

data

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")
0 голосов
/ 08 июня 2018

Прежде всего вам нужно будет суммировать вторую таблицу 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))
0 голосов
/ 08 июня 2018

Вам не нужно присоединяться.Вместо этого свяжите свои таблицы и используйте группу и обобщение из 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))
...