Обновите значения ячеек с именем столбца, используя mutate_at - PullRequest
0 голосов
/ 23 января 2019

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

df <- data.frame(
  id = seq(1,3,1),
  boredom = c(NA, 1, NA),
  stress = c(1, 1, 1),
  contentment = c(NA, NA, NA)
)

Я хочу обновить любые значения ячеек, равные 1, с именем столбца, чтобы у меня был кадр данных, который выглядит следующим образом:

df2 <- data.frame(
  id = seq(1,3,1),
  boredom = c(NA, 'boredom', NA),
  stress = rep('stress', 3), 
  contentment = rep(NA, 3)
)

Затем я могу использовать dplyr :: unite для создания столбца, в котором хранятся все эмоции, о которых сообщают участники, в одном столбце.

Мой интуитивный подход заключается в использовании mutate_at и ifelse (), но я не знаю, как ссылаться на имя столбца в вызове ifelse (). Например, я хочу написать что-то вроде этого:

df_updated <- df %>% 
  mutate_at(vars(boredom:stress), funs(ifelse(. == 1, 'relevant column name', .)))

Я надеюсь, что кто-нибудь подскажет, как получить доступ к имени столбца в вызове ifelse (). Или, если я лаю не на том дереве, руководство по другому подходу также очень приветствуется.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Другим вариантом является преобразование данных из широких в длинные, а затем, при необходимости, изменить значения, прежде чем снова изменять их в широкие.

df %>%
    gather(key, val, -id) %>%
    mutate(val = ifelse(val == 1, key, val)) %>%
    spread(key, val) %>%
    select(names(df))
#  id boredom stress contentment
#1  1    <NA> stress        <NA>
#2  2 boredom stress        <NA>
#3  3    <NA> stress        <NA>
0 голосов
/ 23 января 2019

Попробуйте это:

df %>% mutate_at(vars(boredom:stress), funs(ifelse(. == 1, deparse(substitute(.)), .)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...