簡體   English   中英

在 R 中將所有列從因子更改為數字

[英]Change all columns from factor to numeric in R

我正在處理一個導致一些麻煩的大數據集,因為數據集的某些列被視為因素。 如何將所有列從因子轉換為數字,而不必逐列執行該列?

我試圖應用一個小循環,但它返回 NA 值。 以下是適用於該案例的示例數據:

data <- structure(list(v1 = c(22.394, 43.72, 58.544, 56.877, 1.659, 29.142, 
67.836, 68.851), v2 = c(144.373, 72.3, 119.418, 112.429, 35.779, 
41.661, 166.941, 126.548), v3 = structure(c(33L, 29L, 33L, 5L, 
13L, 31L, 5L, 8L), .Label = c("", "#VALUE!", "0", "1", "10", 
"11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", 
"21", "22", "23", "24", "25", "26", "28", "29", "3", "30", "32", 
"33", "4", "48", "5", "6", "7", "8", "9"), class = "factor"), 
    v4 = structure(c(24L, 6L, 22L, 23L, 16L, 22L, 23L, 26L), .Label = c("", 
    "-1", "-2", "-4", "#VALUE!", "0", "1", "10", "11", "12", 
    "13", "14", "15", "16", "17", "18", "19", "2", "24", "28", 
    "29", "3", "4", "5", "6", "7", "8", "9"), class = "factor")), .Names = c("v1", 
"v2", "v3", "v4"), row.names = c("4", "5", "6", "7", "8", "9", 
"10", "11"), class = "data.frame")

for (i in 1:ncol(data)){
data[,i] <- as.numeric(as.character(data[i]))
} ## returns NAs

是否有一些命令可用於將所有這些列轉換為數字類?

這有效,但我認為您的數據有一個奇怪的字符或空格,這使它作為因素被讀入。 您可以嘗試使用參數stringsAsFactors = FALSE讀入。 但仍然不會解決字符與數字讀入的問題。這是一個修復:

data[] <- lapply(data, function(x) as.numeric(as.character(x)))

## > str(data)
## 'data.frame':   8 obs. of  4 variables:
##  $ v1: num  22.39 43.72 58.54 56.88 1.66 ...
##  $ v2: num  144.4 72.3 119.4 112.4 35.8 ...
##  $ v3: num  7 4 7 10 18 5 10 13
##  $ v4: num  5 0 3 4 18 3 4 7

您可能試圖解決錯誤的問題,或者在錯誤的地方解決問題。 通常,將您認為是數字的列作為因子讀入的原因是因為原始數據中存在數字應包含的字符。 將這些轉換為數字將導致缺失值而不是預期的數字(這比錯誤的數字要好)。 最好修復數據的原始來源,以便正確讀入。

下一個選項是使用colClasses參數read.table和相關函數來指定列應該是數字,轉換將自動進行。 這甚至可以用於(通過更多步驟)將“數字”轉換為“$”、“%”或“,”。

如果這些對您不起作用並且您想轉換現有的數據框,那么這里是一種方法:

w <- which( sapply( mydf, class ) == 'factor' )
mydf[w] <- lapply( mydf[w], function(x) as.numeric(as.character(x)) )

我通過簡單地寫入數據框並讀取它來實現這一點,指定所有列都是數字。 我使用 data.table 包,但它也適用於基本的讀/寫功能。

library(data.table)
fwrite(dfm,"some.name.temp")
dfm <- fread("some.name.temp",colClasses="numeric")

#VALUE! 似乎是奇怪的字符; 如果是這樣,通過使用na.string參數告訴 R 這應該被視為缺失可能是要走的路。

read.table(..., na.string="#VALUE!")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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