Изменение / принуждение нескольких столбцов тибла, избегая петли - PullRequest
0 голосов
/ 12 июня 2018

У меня есть столбец с несколькими столбцами, в которых числа хранятся в виде текста:

my_tbl <- tibble(names = letters[1:5],
                 value1 = as.character(runif(5)), 
                 value2 = as.character(runif(5)))

Теперь я бы хотел изменить тип этих столбцов ("value1" и "value2") ссимвол в цифру.Единственный вариант, который я нашел, - это использование цикла for:

for (i in 2:ncol(my_tbl)) {
  my_tbl[[i]] <- as.numeric(my_tbl[[i]])
}

Есть ли возможность сделать это без цикла?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

С помощью purrr вы можете сделать это:

Если вы уже знаете свои целевые столбцы:

library(purrr)
modify_at(my_tbl,-1,as.numeric)

Если вам нужно их обнаружить:

modify_if(my_tbl,~is.character(.) && !any(grepl("[:alpha:]",.)),as.numeric)

# # A tibble: 5 x 3
#   names value1 value2
#  <chr>  <dbl>  <dbl>
# 1 a      0.715 0.943 
# 2 b      0.639 0.128 
# 3 c      0.471 0.0395
# 4 d      0.374 0.374 
# 5 e      0.500 0.800 

используя dplyr вместо purrr, они дадут те же результаты:

library(dplyr)
mutate_at(my_tbl,-1,as.numeric)
mutate_if(my_tbl,~is.character(.) && !any(grepl("[:alpha:]",.)),as.numeric)

База R переводов:

my_tbl[-1] <- lapply(my_tbl[-1],as.numeric)
my_tbl[] <- lapply(my_tbl,function(x)
  if (is.character(x) && !any(grepl("[:alpha:]",x))) as.numeric(x)
  else x)
0 голосов
/ 12 июня 2018

Вы можете использовать mutate_if из dplyr:

library(dplyr)

my_tbl %>% 
  group_by(names) %>% 
  mutate_if(is.character, as.numeric)


my_tbl 
## A tibble: 5 x 3
## Groups:   names [5]
#  names value1 value2
#  <chr>  <dbl>  <dbl>
#1 a      0.427 0.0191
#2 b      0.817 0.300 
#3 c      0.108 0.158 
#4 d      0.394 0.643 
#5 e      0.775 0.311 
...