有了数据框,我该如何替换所有行和列中的所有特定值。举例来说,我想用替换所有空记录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
Answers:
像这样:
> df[df==""]<-NA
> df
A B
1 <NA> 12
2 xyz <NA>
3 jkl 100
df[df=="xyz"]<-"abc"
将因“无效因子水平”而出错。有更通用的解决方案吗?
由于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)
以下是几个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'))
我们可以使用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是每列的名称。您需要将其插入循环中。