Объединение двух наборов данных по идентификатору без добавления новых столбцов с надписью «.x» или «.y» - PullRequest
0 голосов
/ 16 апреля 2020

Предположим, у меня есть два набора данных. Один основной набор данных со многими столбцами метаданных и один новый набор данных, который будет использоваться для заполнения некоторых пробелов в концентрациях в основном наборе данных:

Основной набор данных:

study_id  timepoint    age    occupation        concentration1   concentration2
1         1            21     0                 3                7
1         2            21     0                 4                6
1         3            22     0                 NA               NA
1         4            22     0                 NA               NA
2         1            36     3                 0                4
2         2            36     3                 2                11
2         3            37     3                 NA               NA
2         4            37     3                 NA               NA

Новый набор данных для слияния:

study_id  timepoint    concentration1   concentration2
1         3            11               20
1         4            21               35
2         3             7               17
2         4            14               25

Всякий раз, когда я объединяюсь по "study_id" и "timepoint", я получаю два новых столбца, которые "spectrum1.y" и "spectrum2.y", в то время как исходные столбцы получают переименовано в "Концентрация 1.x" и "Концентрация2.x". Я не хочу этого.

Это то, что я хочу:

study_id  timepoint    age    occupation        concentration1   concentration2
1         1            21     0                 3                7
1         2            21     0                 4                6
1         3            22     0                 11               20
1         4            22     0                 21               35
2         1            36     3                 0                4
2         2            36     3                 2                11
2         3            37     3                 7                17
2         4            37     3                 14               25

Другими словами, я хочу объединить с помощью «study_id» и «timepoint» И объединить два столбца концентрации поэтому данные находятся в тех же столбцах. Обратите внимание, что оба набора данных не имеют идентичных столбцов (набор данных 1 имеет 1000 столбцов с метаданными, в то время как набор данных 2 имеет только столбцы идентификатора исследования, момента времени и концентрации, которые соответствуют столбцам концентрации в наборе данных1).

Заранее большое спасибо .

1 Ответ

0 голосов
/ 16 апреля 2020

Использование coalesce - это одна опция (из пакета dplyr). Это все еще добавляет два столбца для концентрации 1 и 2 из второго фрейма данных. Они будут удалены после заполнения NA.

library(tidyverse)

df1 %>%
  left_join(df2, by = c("study_id", "timepoint")) %>%
  mutate(concentration1 = coalesce(concentration1.x, concentration1.y),
         concentration2 = coalesce(concentration2.x, concentration2.y)) %>%
  select(-concentration1.x, -concentration1.y, -concentration2.x, -concentration2.y)

Или для обобщения с несколькими столбцами concentration:

df1 %>%
  left_join(df2, by = c("study_id", "timepoint")) %>%
  split.default(str_remove(names(.), "\\.x|\\.y")) %>%
  map_df(reduce, coalesce)

Редактировать : для предотвращения Получив имена столбцов в алфавитном порядке от split.default, вы можете добавить промежуточный этап сортировки списка по порядку имен столбцов первого фрейма данных.

df3 <- df1 %>%
  left_join(df2, by = c("study_id", "timepoint")) %>%
  split.default(str_remove(names(.), "\\.x|\\.y"))

df3[names(df1)] %>%
  map_df(reduce, coalesce)

Вывод

  study_id timepoint age occupation concentration1 concentration2
1        1         1  21          0              3              7
2        1         2  21          0              4              6
3        1         3  22          0             11             20
4        1         4  22          0             21             35
5        2         1  36          3              0              4
6        2         2  36          3              2             11
7        2         3  37          3              7             17
8        2         4  37          3             14             25

Данные

df1 <- structure(list(study_id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
    timepoint = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), age = c(21L, 
    21L, 22L, 22L, 36L, 36L, 37L, 37L), occupation = c(0L, 0L, 
    0L, 0L, 3L, 3L, 3L, 3L), concentration1 = c(3L, 4L, NA, NA, 
    0L, 2L, NA, NA), concentration2 = c(7L, 6L, NA, NA, 4L, 11L, 
    NA, NA)), class = "data.frame", row.names = c(NA, -8L))

df2 <- structure(list(study_id = c(1L, 1L, 2L, 2L), timepoint = c(3L, 
4L, 3L, 4L), concentration1 = c(11L, 21L, 7L, 14L), concentration2 = c(20L, 
35L, 17L, 25L)), class = "data.frame", row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...