繁体   English   中英

如何在 R dataframe 中用 NA 替换空字符串?

[英]How to replace empty string with NA in R dataframe?

当我从 csv 读取数据时,我的第一种方法是使用na.strings="" 。由于某种原因,这不起作用。 我也试过:

df[df==''] <- NA

这给了我一个错误:不能使用矩阵或数组进行列索引。

我只试过专栏:

df$col[df$col==''] <- NA

这会将整个 dataframe 中的每个值都转换为 NA,即使除了空字符串之外还有其他值。

然后我尝试使用mutate_all

replace.empty <- function(a) {
    a[a==""] <- NA
}

#dplyr pipe
df %>% mutate_all(funs(replace.empty))

这也将整个 dataframe 中的每个值都转换为 NA。

我怀疑我的“空”字符串有些奇怪,因为第一种方法没有效果,但我不知道是什么。

编辑(应 MKR 的要求) dput(head(df))

structure(c("function (x, df1, df2, ncp, log = FALSE) ", "{",
"    if (missing(ncp)) ", "        .Call(C_df, x, df1, df2, log)",
"    else .Call(C_dnf, x, df1, df2, ncp, log)", "}"), .Dim = c(6L,
1L), .Dimnames = list(c("1", "2", "3", "4", "5", "6"), ""), class = 
"noquote")

我不确定为什么df[df==""]<-NA对 OP 不起作用。 让我们举一个示例 data.frame 并研究选项。

选项#1: Base-R

df[df==""]<-NA

df
#    One  Two Three Four
# 1    A    A  <NA>  AAA
# 2 <NA>    B    BA <NA>
# 3    C <NA>    CC  CCC

选项#2: dplyr::mutate_allna_if 或者mutate_if如果数据框有多种类型的列

library(dplyr)

mutate_all(df, list(~na_if(.,"")))

或者

#if data frame other types of character Then
df %>% mutate_if(is.character, list(~na_if(.,""))) 

#    One  Two Three Four
# 1    A    A  <NA>  AAA
# 2 <NA>    B    BA <NA>
# 3    C <NA>    CC  CCC

玩具数据:

df <- data.frame(One=c("A","","C"), 
                 Two=c("A","B",""), 
                 Three=c("","BA","CC"), 
                 Four=c("AAA","","CCC"), 
                 stringsAsFactors = FALSE)

df
#   One Two Three Four
# 1   A   A        AAA
# 2       B    BA     
# 3   C        CC  CCC

这应该是使用最新语法的方法。 此版本仅为字符列将 "" 值设置为 NA。 非常方便,因为如果您使用字符列以外的任何东西,更简单的版本会抛出错误。

# For character columns only, replace any blank strings with NA values
df <- df %>%
  mutate(across(where(is.character), ~ na_if(.,"")))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM