Есть ли функция для объединения информации нескольких первичных ключей в таблицу? - PullRequest
1 голос
/ 19 апреля 2019

У меня есть две отдельные таблицы с разными первичными ключами, и мне нужно объединить их.В одной таблице представлен результат, а в другой - ID вовлеченных людей.Поскольку есть несколько результатов, и есть несколько людей, которые могут иметь аналогичные результаты, соединения в моей таблице не синхронизируются должным образом.Возможно, я здесь упускаю шаг и не думаю о чем-то логически, но любой совет очень ценится.

Первоначально я пытался присоединиться к таблице, используя найденную мной функцию:

rbind.all.columns <- function(x, y) {

    x.diff <- setdiff(colnames(x), colnames(y))
    y.diff <- setdiff(colnames(y), colnames(x))

    x[, c(as.character(y.diff))] <- NA

    y[, c(as.character(x.diff))] <- NA

    return(rbind(x, y))
}

Однако,все, что он делает, это дает мне результат и список идентификаторов.

Таблица 1:

EVENT   ID
145754  1738
145754  1756
145639  1738
145639  1756

df1 <- structure(list(EVENT = c(145754L, 145754L, 145639L, 145639L), ID = c(1738L, 1756L, 1738L, 1756L)), class = "data.frame", row.names = c(NA, -4L))

Таблица 2:

ENTRY   EVENT   RESULT
DEL     145754  Was given xxx med
INS     145754  
DEL     145639  Reported stomachache
INS     145639  

df2 <- structure(list(ENTRY = c("DEL", "INS", "DEL", "INS"), EVENT = c(145754L, 145754L, 145639L, 145639L), RESULT = c("Was given xxx med", "", "Reported stomachache", "")), class = "data.frame", row.names = c(NA, -4L))

Желаемая таблица:

ID          EVENT   RESULT
1738, 1756  145754  Was given xxx med
1738, 1756  145639  Reported stomachache

Ответы [ 2 ]

3 голосов
/ 19 апреля 2019

Что нам нужно сделать, это использовать paste, чтобы объединить идентификаторы для того же СОБЫТИЯ в список через запятую:

library(tidyverse)
df1_concat <- df1 %>%
    group_by(EVENT) %>%
    summarise(IDs = paste(ID, collapse = ', '))

# A tibble: 2 x 2
   EVENT IDs       
   <int> <chr>     
1 145639 1738, 1756
2 145754 1738, 1756

Тогда мы можем просто сделать *_join в столбце СОБЫТИЕ:

left_join(df2, df1_concat, by = 'EVENT')

  ENTRY  EVENT               RESULT        IDs
1   DEL 145754    Was given xxx med 1738, 1756
2   INS 145754                      1738, 1756
3   DEL 145639 Reported stomachache 1738, 1756
4   INS 145639                      1738, 1756

Мне не понятно, почему удаляются строки, где ENTRY == 'INS', но в зависимости от логики здесь есть много способов их отфильтровать. Я показываю 2 ниже:

# Remove rows where ENTRY == 'DEL'

left_join(df1_concat, df2, by = 'EVENT') %>%
    filter(ENTRY == 'DEL')

# A tibble: 2 x 4
   EVENT IDs        ENTRY RESULT              
   <int> <chr>      <fct> <fct>               
1 145639 1738, 1756 DEL   Reported stomachache
2 145754 1738, 1756 DEL   Was given xxx med   


# Remove rows with no value for RESULT

left_join(df1_concat, df2, by = 'EVENT') %>%
    filter(RESULT != '')

# A tibble: 2 x 4
   EVENT IDs        ENTRY RESULT              
   <int> <chr>      <fct> <fct>               
1 145639 1738, 1756 DEL   Reported stomachache
2 145754 1738, 1756 DEL   Was given xxx med   
0 голосов
/ 19 апреля 2019

В базе R мы на самом деле могли бы сделать это с помощью однострочника с aggregate, merge и toString (для идентификаторов).

d <- aggregate(ID ~ EVENT + RESULT, merge(df1, df2[which(df2$RESULT != ""), ]), toString)
d
#    EVENT               RESULT         ID
# 1 145639 Reported stomachache 1738, 1756
# 2 145754    Was given xxx med 1738, 1756
...