Как преобразовать все факторные столбцы в числовые, имена которых совпадают из списка строк? - PullRequest
0 голосов
/ 12 июня 2019

Я еще не нашел эту точную проблему здесь. У меня есть много столбцов, и для всех тех, которые соответствуют ЛЮБОМУ из списка строк, я хочу преобразовать из фактора -> символ -> числовой.

Ниже показан пример, в котором столбцы, содержащие одну из строк, преобразуются, и две вещи, которые я пробовал для случая нескольких строк, которые потерпели неудачу

#Making fake data where every column is a factor. At the end I'd like to convert all factors that contain either "alcium" or "zinc" in the column name.
library(reshape2)
fake <-data.frame(id=c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3),              
              time=c(rep("Time1",9), rep("Time2",9)), 
            test=c("calcium","magnesium","zinc","calcium","magnesium","zinc","calcium","magnesium","zinc","calcium","magnesium","zinc","calcium","magnesium","zinc","calcium","magnesium","zinc"), 
              score=floor(runif(18, min=1, max=5)))

fake <- dcast(fake, id ~ time + test)
fake <- fake %>% mutate_if(is.numeric,as.factor)

#This works, but only for columns containing one of the strings
fake <- fake %>% mutate_at(vars(contains('alcium')),  function(x) as.numeric(as.character(x))) 

#Now trying to convert all columns containing either "alcium" or "zinc"
fake <- fake %>% mutate_at(vars(contains('alcium'| 'zinc')),  function(x) as.numeric(as.character(x))) 
#gives an error

#2nd attempt:
strings <- c("alcium", "zinc")
fake <- fake %>% mutate_at(vars(contains(strings)),  function(x) as.numeric(as.character(x)))  
#gives an error

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Использование помощника выбора matches() вместо contains() позволяет передавать строки, свернутые в дружественный регулярному выражению формат.

library(dplyr)
strings <- c("alcium", "zinc")

fake %>%
  as_tibble %>%
  mutate_at(vars(matches(paste0(strings, collapse = "|"))),  as.numeric) 

# A tibble: 3 x 8
  id    Time1_calcium `Time1_ma    gnesium` Time1_magnesium Time1_zinc Time2_calcium Time2_magnesium Time2_zinc
  <fct>         <dbl> <fct>                 <fct>                <dbl>         <dbl> <fct>                <dbl>
1 1                 2 NA                    4                        1             3 4                        1
2 2                 2 NA                    3                        2             1 1                        3
3 3                 1 3                     NA                       1             2 3                        2
0 голосов
/ 12 июня 2019

Я немного обновил ваш код.

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

sofaWa <- fake %>% mutate_at(vars(contains('alcium')), list(as.numeric)) %>% 
  mutate_at(vars(contains('zinc')), list(as.numeric)) 

Производит это

# A tibble: 3 x 7
  id    Time1_calcium Time1_magnesium Time1_zinc Time2_calcium Time2_magnesium Time2_zinc
  <fct>         <dbl> <fct>                <dbl>         <dbl> <fct>                <dbl>
1 1                 3 2                        1             1 2                        1
2 2                 2 1                        2             1 1                        2
3 3                 1 4                        2             2 3                        1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...