簡體   English   中英

如何將條目長度≤1的所有列轉換為數字?

[英]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_guessreadr

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM