Преобразование значений ключей из одного фрейма данных в столбцы другого фрейма данных - PullRequest
0 голосов
/ 05 июля 2018

Я искал вокруг, но не смог найти конкретный ответ на мой вопрос.

Предположим, у меня есть два фрейма данных:

df1 <- data.frame(name = c('a', 'b', 'c'),
                  t1 = c(3, 25, 400),
                  t2 = c(3, 25, 400),
                  t3 = c(NA, 25, 800),
                  t4 = c(NA, 25, 800),
                  t5 = c(NA, 25, 800),
                  t6 = c(NA, 25, 800),
                  t7 = c(5, 90, 1200))

df2 <- data.frame(id = c(1, 2),
                  t1 = c(0.33, 0.98),
                  t2 = c(0.87, 0.54),
                  t3 = c(0.92, 0.84),
                  t4 = c(0.65, 0.16),
                  t5 = c(0.94, 0.84),
                  t6 = c(0.16, 0.02),
                  t7 = c(0.93, 0.18))

В приведенном выше примере df2 имеет две строки данных для тестовых измерений. (t1 .. t7)

df1 имеет значения для условия испытания (a, b, c), при котором проводились тестовые измерения (t1 .. t7).

Я ищу способ создания нового фрейма данных, который преобразует условия теста (a, b, c) в столбцы и объединяет их с тестовыми измерениями, чтобы результирующий кадр данных выглядел следующим образом:

# Desired Output
#
#  id   a   b   c    t1    t2    t3    t4    t5    t6    t7
#  1    3   25  400  0.33  0.87  NA    NA    NA    NA    NA
#  1    NA  25  800  NA    NA    0.92  0.65  0.94  0.16  NA
#  1    5   90  1200 NA    NA    NA    NA    NA    NA    0.93
#  2    3   25  400  0.98  0.54  NA    NA    NA    NA    NA
#  2    NA  25  800  NA    NA    0.84  0.16  0.84  0.02  NA
#  2    5   90  1200 NA    NA    NA    NA    NA    NA    0.18

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 05 июля 2018

Вот способ, используя gather, inner_join, а затем два вызова spread:

library(tidyverse)

df1 %>%
    gather(variable, value, -name) %>% #wide to long
    inner_join(df2 %>% gather(variable, value, -id), by = 'variable') %>%
    spread(name, value.x) %>% # spread first time
    spread(variable, value.y) # spread second time

  id  a  b    c   t1   t2   t3   t4   t5   t6   t7
1  1  3 25  400 0.33 0.87   NA   NA   NA   NA   NA
2  1  5 90 1200   NA   NA   NA   NA   NA   NA 0.93
3  1 NA 25  800   NA   NA 0.92 0.65 0.94 0.16   NA
4  2  3 25  400 0.98 0.54   NA   NA   NA   NA   NA
5  2  5 90 1200   NA   NA   NA   NA   NA   NA 0.18
6  2 NA 25  800   NA   NA 0.84 0.16 0.84 0.02   NA

Может быть полезно пройти по каждой строке один за другим, чтобы увидеть результаты. Это дало бы очень длинный и громоздкий ответ, но вы должны рассмотреть возможность сделать это в своей собственной R сессии.

...