104

有一个数据框,我如何去替换所有行和列的所有特定值。例如,我想用NA's 替换所有空记录(不输入位置):

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
4

5 回答 5

157

像这样:

> df[df==""]<-NA
> df
     A    B
1 <NA>   12
2  xyz <NA>
3  jkl  100
于 2013-10-21T19:44:17.370 回答
37

由于 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)
于 2015-12-08T01:12:06.680 回答
26

这里有几个dplyr选项:

library(dplyr)

# all columns:
df %>% 
  mutate_all(~na_if(., ''))

# specific column types:
df %>% 
  mutate_if(is.factor, ~na_if(., ''))

# specific columns:  
df %>% 
  mutate_at(vars(A, B), ~na_if(., ''))

# or:
df %>% 
  mutate(A = replace(A, A == '', NA))

# replace can be used if you want something other than NA:
df %>% 
  mutate(A = as.character(A)) %>% 
  mutate(A = replace(A, A == '', 'used to be empty'))
于 2019-03-22T01:48:48.180 回答
5

我们可以使用 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)

如果您只想使用 data.frame 并保留因素,那就更困难了,您需要使用

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

其中 value 是每列的名称。您需要将其插入循环中。

于 2016-11-28T19:28:45.493 回答
1

如果要替换数据框中的多个值,循环遍历所有列可能会有所帮助。

假设您要替换""and 100

na_codes <- c(100, "")
for (i in seq_along(df)) {
    df[[i]][df[[i]] %in% na_codes] <- NA
}
于 2017-04-07T02:11:20.733 回答