2017-08-28 74 views
0

我有一些數據,其中某些列中混合了characternumeric數據。例如:如何將多列中的特定字符串更改爲NA並將列更改爲數字

Sensor Sensor2 Sensor3 
Fail 5   Fail 
Fail 5   Fail 
Fail 5   Fail 
Fail 5   Fail 
5  5   Fail 
6  5   Fail 
8  5   Fail 

所有傳感器值應該是numeric,但ř自動採取傳感器1和傳感器3作爲character值。我想用NA或某些數值替換「失敗」,或者將整個列類型更改爲數字類型,因此「失敗」將自動更改爲NA

我的問題是我的數據集非常大(傳感器數據每秒產生一次,超過200個變量)。我想識別所有包含「失敗」的列,並將這些列更改爲numeric類型。

這就是我想:我寫了一個函數

function(mydata, value1, value2){ 
    mydata <- data.frame(lapply(mydata, function(x){    
    gsub(value1, value2 ,x) 
    })) 
} 

此功能,但唯一的問題是,整個數據幀改爲factor類型。我有一個numericcharacter的混合,我想保持數據類型正確。所以,我想

function(mydata, value1, value2){ 
    mydata <- data.frame(lapply(mydata, function(x){    
    is.numeric(gsub(value1, value2 ,x)) 
    })) 
    } 

這改變了我的專欄所有numeric,所以我錯過了所有的character列信息。

如何才能識別「失敗」列,並僅更改這些列並更新我的數據框?謝謝。

+1

如果您使用任何'read.xyz'函數來讀取您的數據,例如'read.table',你可以使用'na.strings'參數,比如'na.strings = c(<你想解釋爲NA的所有字符串)'。 – Henrik

+0

相關:[用數據框中的NA替換字符值](https://stackoverflow.com/questions/3357743/replacing-character-values-with-na-in-a-data-frame/3357804#3357804) – Henrik

+0

是的,亨裏克。我知道這種方法。我正在編寫一些自動功能,可以在一系列數據預處理/清理步驟中完成這項工作,因爲我們的用戶通常只是使用數據導入按鈕來導入數據本身。一些清潔工作是在數據導入後完成的。非常感謝! –

回答

0

我創建

data <- read.table(text = "Sensor Sensor2 Sensor3 
        Fail 5   Fail 
        Fail 5   Fail 
        Fail 5   Fail 
        Fail 5   Fail 
        5  5   Fail 
        6  5   Fail 
        8  5   Fail", 
        header = TRUE, stringsAsFactors = FALSE) 
data$char <- letters[1:nrow(data)] 

最後一行引入了一個附加列不應該被轉換爲數字數據。例如。

請注意,我使用stringsAsFactors = FALSE來確保沒有列成爲因子。您還應該檢查您的數據是否在之前沒有包含任何因子變量

的第一步是確定含有"Fail"某處列:

fail_cols <- sapply(data, function(x) any(grepl("Fail", x))) 

然後,我定義與NA取代"Fail"並轉換爲數字的函數:

to_num <- function(x) { 
    as.numeric(gsub("Fail", NA, x)) 
} 

請注意,我用as.numeric(),而不是is.numeric()。前者轉換爲數字,後者檢查變量是否爲數字。

此功能目前只適用於包含"Fail"數據幀的那些列:

data[fail_cols] <- lapply(data[fail_cols], to_num) 
data 
## Sensor Sensor2 Sensor3 char 
## 1  NA  5  NA a 
## 2  NA  5  NA b 
## 3  NA  5  NA c 
## 4  NA  5  NA d 
## 5  5  5  NA e 
## 6  6  5  NA f 
## 7  8  5  NA g 

你已經在使用簡單的as.numeric()代替to_num()會產生相同的結果的提問時指出。但是,它會有發出警告信息的缺點。爲了避免這些,定義to_num()可能仍然有幫助。

+0

嗨,Stibu,謝謝你的回覆,我非常感謝。我認爲is.numeric只是一個錯字,在我的函數中我確實有as.numeric。首先,這一步是我的大數據集預處理/清理的一部分。我不想將以前的結果保存爲表格,並在此步驟中再次讀取它們;其次,我只是嘗試了你的解決方案。我認爲你的解決方案與我自己的解決方案有同樣的問題。所有其他字符類型列也更改爲NA。 –

+0

對不起,我錯過了關於應該保留字符的列的要點。不幸的是,你的示例數據不包含這種類型的列。嘗試在您的下一個問題中創建更加實際的示例數據... – Stibu

+0

非常感謝,Stibu。問題解決了!欣賞它。 –

相關問題