Реорганизация кадра данных с несколькими типами заголовков в соответствии с аккуратным подходом в R

У меня есть кадр данных, который выглядит примерно так:

Age  A1U_sweet  A2F_dip  A3U_bbq  C1U_sweet  C2F_dip  C3U_bbq  Comments
23   1          2        1        NA         NA       NA       Good
54   NA         NA       NA       4          1        2        ABCD
43   2          4        7        NA         NA       NA       HiHi

Я пытаюсь реорганизовать его так, как показано ниже, чтобы сделать его более «аккуратным». Есть ли способ сделать это, который также включает столбцы «Возраст» и «Комментарии» в том же стиле, что и для других переменных ниже? Как бы вы предложили их включить - одна идея показана ниже, но я открыт для других предложений. Как мне изменить следующий код, чтобы учесть несколько разных стилей имени столбца?

library(tidyr)

df <- data.frame(id = 1:nrow(df), df)
dfl <- gather(df, key = "key", value = "value", -id)
dfl <- separate(dfl, key, into = c("key", "kind", "type"), sep = c(1, 4))
df2 <- spread(dfl, key, value)
df2
##   id kind  type     A    C
## 1  1  Age   Age    23   23
## 2  1  1U_ sweet     1   NA
## 3  1  2F_   dip     2   NA
## 4  1  3U_   bbq     1   NA
## 5  1  Com   Com  Good Good
## 6  2  Age   Age    54   54
## 7  2  1U_ sweet    NA    4
## 8  2  2F_   dip    NA    1
## 9  2  3U_   bbq    NA    2
##10  2  Com   Com  ABCD ABCD
##11  3  Age   Age    43   43
##12  3  1U_ sweet     2   NA
##13  3  2F_   dip     4   NA
##14  3  3U_   bbq     7   NA
##15  3  Com   Com  HiHi HiHi

И как мне изменить следующий код, чтобы вернуть данные в исходное состояние?

df <- gather(df2, key = "key", value = "value", A, B, C)
df <- unite(df, "key", key, kind, type, sep = "")
df <- spread(df, key, value)

Для контекста этот вопрос был вызван комментарием Исты под этим вопросом: -title-names/48716608?noredirect=1#comment84433560_48716608">Объединение столбцов в R на основе соответствия началу названий столбцов


person melbez    schedule 10.02.2018    source источник
comment
Где у вас age и comments в ваших данных? Я не понимаю, что ты говоришь. Не могли бы вы уточнить это?   -  person jazzurro    schedule 10.02.2018
comment
Как упомянул @jazzurro, неясно, что такое age и sweets. Пожалуйста, обновите свой пример с ожидаемым результатом   -  person akrun    schedule 10.02.2018
comment
Что вы пробовали? Что не сработало, как хотелось?   -  person Ista    schedule 10.02.2018
comment
Лучше уточнить свой вопрос. Просить сообщество прокомментировать данные, не включенные в ваш пример, является нарушением этикета.   -  person Nettle    schedule 10.02.2018
comment
Я обновил фрейм данных, чтобы отразить эти комментарии. Я также включил ссылку на вопрос с комментарием Исты, который изначально вдохновил этот вопрос. Спасибо за ответ.   -  person melbez    schedule 10.02.2018
comment
Вы не поняли основных понятий. Вы должны научиться мыслить с точки зрения единиц наблюдения и измерений. Начните с чтения vita.had.co.nz/papers/tidy-data.pdf и задавайте здесь вопросы, только если вы застряли. Не ждите, что люди будут кормить вас ответами, которые придут сами собой, если вы только потратите время на изучение основ.   -  person Ista    schedule 11.02.2018
comment
Спасибо за PDF. Я прочитаю это. Уверяю вас, я бы не задавал здесь вопрос, если бы думал, что сам разберусь. Я был бы признателен за любые другие рекомендации в дополнение к этой статье.   -  person melbez    schedule 11.02.2018


Ответы (1)


Поскольку Age и Comments предположительно измеряются на уровне строки исходных данных, просто возьмите их с собой:

df <- data.frame(id = 1:nrow(df), df)

dfl <- gather(df, key = "key", value = "value", -id, -Age, -Comments)
dfl <- separate(dfl, key, into = c("key", "kind", "type"), sep = c(1, 4))
df2 <- spread(dfl, key, value)
df2

df2 <- transform(df2, B = ifelse(is.na(A), C, A))
df2

df <- gather(df2, key = "key", value = "value", A, B, C)
df <- unite(df, "key", key, kind, type, sep = "")
df <- spread(df, key, value)
df
person Ista    schedule 11.02.2018