R: Распределить пары ключ-значение, когда ключи находятся в разных столбцах и частота возвращаемого значения

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

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

df = data.frame(id = c(10, 11, 12, 13, 14),
                V1 = c('blue', 'blue', 'blue', NA, NA),
                V2 = c('blue', 'yellow', NA, 'yellow', 'green'),
                V3 = c('yellow', NA, NA, NA, 'blue'))

Я хочу использовать значения V1-V3 в качестве уникальных заголовков столбцов и хочу, чтобы частота появления каждого из них в каждой строке заполняла строки.

Желаемый результат:

desired = data.frame(id = c(10, 11, 12, 13, 14),
                     blue = c(2, 1, 1, 0, 1),
                     yellow = c(1, 1, 0, 1, 0),
                     green = c(0, 0, 0, 0, 1))

Вероятно, есть действительно крутой способ сделать это с помощью tidyr:: spread и dplyr:: sumrize. Тем не менее, я не знаю, как распространять столбцы V*, когда ключи, по которым я хочу распространять, повсюду в разных столбцах и включают в себя NA.

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

1 ответ

Решение

С помощью meltа также dcast из пакета reshape2:

dcast(melt(df, id="id", na.rm = TRUE), id~value)

  id blue green yellow
1 10    2     0      1
2 11    1     0      1
3 12    1     0      0
4 13    0     0      1
5 14    1     1      0

Как предположил David Arenburg, использовать его проще recast, обертка для melt а также dcast:

recast(df, id ~ value, id.var = "id")[,1:4]   # na.rm is not possible then

  id blue green yellow
1 10    2     0      1
2 11    1     0      1
3 12    1     0      0
4 13    0     0      1
5 14    1     1      0
Другие вопросы по тегам