Я ищу способ условно заменить определенные значения в подмножестве столбцов, при этом имя столбца останется в тидиверсе. См. Пример ниже:
wl <- data_frame(x=1:4,
multi=c("Y","Y","Y","Y"),
ABC=c("","Y","Y",""),
ABD=c("","","",""),
ABE=c("Y","Y","","Y"))
# A tibble: 4 x 5
x multi ABC ABD ABE
<int> <chr> <chr> <chr> <chr>
1 1 Y "" "" Y
2 2 Y Y "" Y
3 3 Y Y "" ""
4 4 Y "" "" Y
df <- wl %>% mutate_at(vars(matches("AB")),
funs(replace(.,.=='Y',values="column name")))
# A tibble: 4 x 5
x multi ABC ABD ABE
<int> <chr> <chr> <chr> <chr>
1 1 Y "" "" column name
2 2 Y column name "" column name
3 3 Y column name "" ""
4 4 Y "" "" column name
за исключением того, что это будет фактическое имя столбца, а не «имя столбца». Я использовал здесь два разных ответа, чтобы перейти как к изменению условных столбцов (именно так я попал в свой пример), так и к тому, как заменить определенные значения именем столбца (не используется в моем текущем примере, но ответ здесь).
Я могу объединить два ответа, чтобы заставить его работать:
w <- which(df=="column name",arr.ind=TRUE)
df[w] <- names(df)[w[,"col"]]
# A tibble: 4 x 5
x multi ABC ABD ABE
<int> <chr> <chr> <chr> <chr>
1 1 Y "" "" ABE
2 2 Y ABC "" ABE
3 3 Y ABC "" ""
4 4 Y "" "" ABE
Я подтверждаю, что описанный выше процесс полностью функционален, но из чистого любопытства есть ли способ сделать это без второго фрагмента кода? Есть ли какая-то функция, которую я могу подключить к values=
части шага replace(.,.=='Y',values="column name")
, которая может захватывать имя столбца и выполнять весь этот процесс в рамках одной mutate_at
функции?
gather
, затемmutate
, затемspread
, напримерwl %>% gather(ColName,Result, matches("AB")) %>% mutate(Result = if_else(Result =="Y", ColName, Result)) %>% spread(ColName, Result)
- person Kerry Jackson   schedule 16.08.2018