цикл по имени столбца как объекта - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь использовать loop через имена столбцов в фрейме данных.

У меня есть набор данных, testset, который имеет около 100 столбцов. Для упрощения я буду называть эти столбцы в алфавите, a, b, c, ... и т. Д.

Я сделал function, чтобы преобразовать значения в testset в другие значение.

mutatefun<-function(i){
  i1<-rlang::quo_name(enquo(i))
  output<-testset%>%mutate(!! i1:=case_when({{i}} %in% c(1)~0,
                                   {{i}} %in% c(2)~50,
                                   {{i}} %in% c(3)~100,
                                   TRUE~NA_real_))
  return(output)
  }

Когда я запустил mutatefun(a), это сработало. Теперь я хочу использовать эту функцию для нескольких столбцов в testset

С помощью этого поста R: просматривая имена столбцов , я создал varlist и запустил этот код.

varlist<-c("a","c","e","k")

for(i in varlist){
output<-mutatefun({{i}})}

Однако, он не дал ожидаемых результатов. Вместо этого он возвращает столбец a как NA. Я думаю, что i может считаться только символом, а не объектом testset.

Не могли бы вы дать мне знать, как решить эту проблему?

1 Ответ

0 голосов
/ 28 января 2020

Попробуйте использовать map_dfc с transmute

library(dplyr)

purrr::map_dfc(varlist, ~{
   var <- sym(.x)
   transmute(testset, !!.x := case_when(!!var == 1~0, 
                                        !!var == 2~50, 
                                        !!var == 3~100, 
                                        TRUE~ NA_real_))
})

Если вам нужны другие столбцы, которых нет в varlist, вы можете добавить

%>% bind_cols(testset %>% select(-varlist))

в конце цепь.

...