У меня есть следующий код, где мне нужно извлечь имена столбцов из переменной, а затем выборочно выполнить операцию со строками, используя указанный столбец в этой операции.Вот мой простой пример: создание столбца res
для соответствия столбцу targe
t:
library(tidyverse)
tst <- tibble(grp = c("a","a","b","b","c","c"), a = rep(2,6), b = rep(4,6),
c = rep(8,6), target = c(2,2,4,4,8,8), res = rep(0,6))
# create list of columns to iterate over
lst <- unique(tst$grp)
# loop over each column, creating a dummy column with
# the copied value in the matching rows, zeroes elsewhere
for(g in lst) {
tst <- tst %>%
mutate(!!paste("res", g, sep="_") := ifelse(grp == g, !!rlang::sym(g),0)) %>%
select(!!paste("res", g, sep="_")) %>%
cbind(tst)
}
# combine the dummy columns by rowSum
res <- tst %>% select(starts_with("res_")) %>% mutate(res = rowSums(.)) %>%
select(res)
# tidy up the output, result matches the target
tst <- tst %>% select(grp, a, b, c, target) %>% cbind(res)
tst
grp a b c target res
1 a 2 4 8 2 2
2 a 2 4 8 2 2
3 b 2 4 8 4 4
4 b 2 4 8 4 4
5 c 2 4 8 8 8
6 c 2 4 8 8 8
Я использовал итеративный подход, просматривая уникальные переменные в столбце grp
, создавая временныезатем столбцы rowSum()
, чтобы получить окончательный результат.Неуклюжий, но добрался до конца.
Я уверен, что есть более элегантный способ сделать это с одним из map
семейства purrr
.Может кто-нибудь показать мне, как я могу сделать это без цикла, используя purrr
?Я действительно изо всех сил пытался заставить динамическое имя столбца работать, используя этот подход.Заранее спасибо.