2013-10-21 84 views
47

有了數據框,我該如何去替換沿着所有行和列的所有特定值。例如說,我想,以取代NA的所有空的記錄(不鍵入位置):替換數據框中的所有特定值

df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100))) 

    A B 
1  12 
2 xyz  
3 jkl 100 

預期結果:

A B 
1 NA 12 
2 xyz NA 
3 jkl 100 

回答

70

像這樣:

> df[df==""]<-NA 
> df 
    A B 
1 <NA> 12 
2 xyz <NA> 
3 jkl 100 
+10

是有沒有辦法超過1個值有效地做到這一點!? – PikkuKatja

+10

這對於因素不起作用,'df [df ==「xyz」] < - 「abc」'將出現「無效因子水平」錯誤。有更通用的解決方案嗎? – glallen

+0

不適合我。我試過這個: dfSmallDiscreteCustomSalary [dfSmallDiscreteCustomSalary $ salary ==「<= 50K」] < - 「49K」。 仍然是唯一的(dfSmallDiscreteCustomSalary $薪水)我得到: [1]> 50K <= 50K –

19

由於PikkuKatja並且glallen要求一個更一般的解決方案,我現在還不能評論,我會寫一個答案。您可以將報表中:

> df[df=="" | df==12] <- NA 
> df 
    A B 
1 <NA> <NA> 
2 xyz <NA> 
3 jkl 100 

有關因素,zxzak的代碼已經產生的因素:

> df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100))) 
> str(df) 
'data.frame': 3 obs. of 2 variables: 
$ A: Factor w/ 3 levels "","jkl","xyz": 1 3 2 
$ B: Factor w/ 3 levels "","100","12": 3 1 2 

如果遇到了麻煩,我建議暫時下降的因素。

df[] <- lapply(df, as.character) 
2

我們可以使用data.table快速獲取它。 首先沒有因素造成DF,

df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F) 

現在你可以使用

setDT(df) 
for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA) 

,你可以將其轉換回data.frame

setDF(df) 

如果你只想使用數據並保留因素更加困難,您需要使用

levels(df$value)[levels(df$value)==""] <- NA 

其中value是每列的名稱。您需要將其插入到循環中。

+2

爲什麼要在這個用例中使用外部庫?爲什麼一個循環,如果這可以用一條線解決?你的答案如何增加超出已有答案的價值?我不打算苛刻,我想我錯過了一些東西,因此提出了問題。 – sedot

+1

大型數據集的速度要快得多。它增加了一個替代方案,以便用戶可以爲他選擇最好的。 – skan

0

如果要替換數據框中的多個值,循環遍歷所有列可能會有所幫助。

說你要替換""100

na_codes <- c(100, "") 
for (i in seq_along(df)) { 
    df[[i]][df[[i]] %in% na_codes] <- NA 
} 
相關問題