如何将条目长度≤1的所有列转换为数字?

时间:2019-07-04 01:40:18

标签: r dplyr purrr mutate

我有一个约80列的数据框,其中约20-40列具有以字符形式存储的一位整数。其他字符列都是完整的句子(因此,length >>> 1),因此,如果我尝试使用NA,请强制使用mutate_if(is.character, as.numeric)

我想高效地进行转换,并且基于on this question,我希望有这样的东西:

df %>% map_if(is.character & length(.) <= 1, as.numeric)

但是,这不起作用。我希望有一个tidy解决方案,也许使用purrr

2 个答案:

答案 0 :(得分:3)

针对这些情况的最佳功能是readr中的type_convert()

“ [{type_convert()重新转换数据框中的字符列],如果您需要进行一些手动调整,这很有用-您可以将字符列读取,并用(例如)常规字符进行清理表达式和其他转换,然后让readr进行分析时会遇到其他麻烦。”

因此,您所需要做的就是将其添加到管道的末尾:

df %>% ... %>% type_convert() 

或者,我们可以使用type.convert中的base R,它会根据该值自动检测列类型并进行更改

df[] <- type.convert(df, as.is = TRUE)

如果要查找仅包含一个字符的列

i1 <- !colSums(nchar(as.matrix(df)) > 1)
df[i1] <- type.convert(df[i1])

如果我们要使用tidyverse,则parse_guess中有readr

library(tidyverse)
library(readr)
df %>%
     mutate_if(all(nchar(.) == 1), parse_guess)

答案 1 :(得分:1)

您可以检查nchar列中的mutate_if

library(dplyr)
df %>%  mutate_if(~all(nchar(.) == 1) & is.character(.), as.numeric) 

使用示例数据

df <- data.frame(a = c("ab", "bc", "de", "de", "ef"), 
                 b = as.character(1:5), stringsAsFactors = FALSE)

df1 <- df %>% mutate_if(~all(nchar(.) == 1) & is.character(.), as.numeric) 

str(df1)
#'data.frame':  5 obs. of  2 variables:
# $ a: chr  "ab" "bc" "de" "de" ...
# $ b: num  1 2 3 4 5

您也可以对map_if进行同样的操作,但是它会返回一个列表,您需要将其转换回数据框

library(purrr)

df %>% 
   map_if(~all(nchar(.) == 1) & is.character(.), as.numeric) %>% 
   as.data.frame(., stringsAsFactors = FALSE)