我有一个约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
?
答案 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)