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'))
make_na <- \(x, z) {x <- replace(x, x %in% z, NA); if (is.factor(x)) droplevels(x) else x}
我们可以把它应用到一个向量上,
make_na(dat$character, To_NA)
# [1] NA NA NA NA "a" NA "a" "a" NA NA "b" NA
或者使用lapply在列上循环。
dat[] <- lapply(dat, make_na, To_NA)
给予
dat
# character integer Date factor POSIX
# 1 <NA> 4 2022-07-10 B 2022-07-10 20:08:10
# 2 <NA> 1 2022-07-11 <NA> 2022-07-10 21:08:10
# 3 <NA> NA 2022-07-12 <NA> 2022-07-10 22:08:10
# 4 <NA> 2 2022-07-13 B 2022-07-10 23:08:10
# 5 a 3 2022-07-14 <NA> <NA>
# 6 <NA> 1 2022-07-15 <NA> 2022-07-11 01:08:10
# 7 a NA 2022-07-16 <NA> 2022-07-11 02:08:10
# 8 a NA <NA> A 2022-07-11 03:08:10
# 9 <NA> 4 2022-07-18 <NA> 2022-07-11 04:08:10
# 10 <NA> 0 2022-07-19 <NA> 2022-07-11 05:08:10
# 11 b NA 2022-07-20 B 2022-07-11 06:08:10
# 12 <NA> NA 2022-07-21 A 2022-07-11 07:08:10
其中:
str(dat)
# 'data.frame': 12 obs. of 5 variables:
# $ character: chr NA NA NA NA ...
# $ integer : int 4 1 NA 2 3 1 NA NA 4 0 ...
# $ Date : Date, format: "2022-07-10" "2022-07-11" "2022-07-12" ...
# $ factor : Factor w/ 2 levels "A","B": 2 NA NA 2 NA NA NA 1 NA NA ...
# $ POSIX : POSIXct, format: "2022-07-10 20:08:10" "2022-07-10 21:08:10" "2022-07-10 22:08:10" ...
8条答案
按热度按时间yshpjwxd1#
就像这样:
63lcw9qa2#
由于PikkuKatja和glallen要求一个更一般的解决方案,我还不能发表评论,我将写一个答案。你可以合并语句如下:
对于因子,zxzak的代码已经生成了因子:
如果遇到麻烦,我建议暂时放弃因子。
cygmwpex3#
以下是一些
dplyr
选项:fcy6dtqo4#
我们可以用data.table来快速得到它,首先创建没有因子的df,
现在您可以使用
你可以把它转换回 Dataframe
如果你只想使用数据.frame并保留因子,那就比较困难了,你需要使用
其中value是每个列的名称。您需要将其插入到循环中。
wfauudbj5#
如果要替换数据框中的多个值,则循环遍历所有列可能会有所帮助。
假设您要替换
""
和100
:hyrbngr76#
对于要替换的多个值和因子,似乎缺少一个解决方案,因此我将添加一个。
考虑具有各种类的 Dataframe
dat
。我们可以把所有我们想要转换成NA的东西放在一个列表
to_na
上,并在基于
replace
的小函数make_na
中使用它。if
相应的变量is.factor
我们可能想要对刚被删除的值进行droplevels
。我们可以把它应用到一个向量上,
或者使用
lapply
在列上循环。给予
其中:
wj8zmpe17#
另一种选择是使用
naniar
包中的replace_with_na_all()
,它允许您替换整个 Dataframe 中满足条件的所有值。这种方法的好处是,如果你有一些单元格也包含空格,那么我们可以在conditions参数中同时提供这两个参数,尽管最好先删除空格,然后再使用上面的函数(例如,将
mutate(across(everything(), ~ trimws(.x)))
添加到管道中)。blmhpbnm8#
另一个选项是使用
sapply
。下面是一个可重现的示例:创建于2023年1月15日,使用reprex v2.0.2
\(x)
而不是function(x)