[英]How do I convert all factor columns to numeric that have colnames matching from a list of strings?
[英]How to convert all columns where entries have length ≤1 to numeric?
我有一個包含約 80 列的數據框,其中約 20-40 列具有存儲為字符的個位數整數。 其他字符列是完整的句子(因此, length >>> 1
),因此如果我嘗試mutate_if(is.character, as.numeric)
被強制為NA
。
我想有效地轉換這些,基於這個問題,我希望有這樣的事情:
df %>% map_if(is.character & length(.) <= 1, as.numeric)
但是,這不起作用。 我希望有一個tidy
解決方案,也許使用purrr
?
這些情況的最佳函數是type_convert() ,來自readr
:
“[ type_convert()
重新轉換數據框中的字符列],如果您需要進行一些手動調整,這很有用 - 您可以將列作為字符讀取,使用(例如)正則表達式和其他轉換進行清理,然后讓readr
再次嘗試解析它。”
因此,您需要做的就是將它添加到管道的末尾:
df %>% ... %>% type_convert()
或者,我們可以使用base R
type.convert
,它會根據值自動檢測列類型並更改它
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)
你可以檢查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
執行相同的map_if
,但是它返回一個列表,您需要將其轉換回數據幀
library(purrr)
df %>%
map_if(~all(nchar(.) == 1) & is.character(.), as.numeric) %>%
as.data.frame(., stringsAsFactors = FALSE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.