在DataFrame中查找并将所有列的值替换为NA

3
Age <- c(90,56,51,'NULL',67,'NULL',51)
Sex <- c('Male','Female','NULL','male','NULL','Female','Male')
Tenure <- c(2,'NULL',3,4,3,3,4)
df <- data.frame(Age, Sex, Tenure)

在上面的例子中,存在以字符/字符串格式表示的“NULL”值。我试图用NA替换“NULL”值。我能够对单个列执行此操作,例如df$age[which(df$Age=='NULL)]<-NA',但是我不想为所有列编写这个代码。
如何应用类似的逻辑来处理所有列,以便将df的所有'NULL'值转换为NAs?我猜测可以使用apply、自定义定义函数或for循环来实现。

请查看我在 此答案 中描述的 makemeNA 函数,并从 这里 下载。然后您可以使用 makemeNA(df, "NULL") 进行操作。 - A5C1D2H2I1M1N2O1R2T1
1
可能重复:https://dev59.com/THA75IYBdhLWcg3wUHWQ - user20650
3个回答

14

基本R解决方案

replace(df, df =="NULL", NA)

4

甚至可以一步替换使用:

df[df=="NULL"] <- NA

1
我们可以使用 dplyr替换 所有列中的 'NULL' 值,然后使用 type.convert 将列的类型转换。当前,所有列都是 factor 类(假设 'Age/Tenure' 应该是 numeric/integer 类)。
library(dplyr)
res <- df %>%
         mutate_all(funs(type.convert(as.character(replace(., .=='NULL', NA)))))
str(res)
#'data.frame':   7 obs. of  3 variables:
#$ Age   : int  90 56 51 NA 67 NA 51
#$ Sex   : Factor w/ 3 levels "Female","male",..: 3 1 NA 2 NA 1 3
#$ Tenure: int  2 NA 3 4 3 3 4

感谢您的回复。我正在尝试将此逻辑应用于我的较大数据框,该数据框还包含一个日期时间类列,其中有几个“NULL”值。但是,我遇到了一个错误,显示Error in mutate_impl(.data, dots) : Evaluation error: character string is not in a standard unambiguous format. - Ashish25
假设数据的结构类似于您展示的示例,那么它应该可以工作。请使用str(df)str(yourlargerdata)检查类中是否有任何差异。 - akrun
1
我解决了。我猜我的str(myDataFrame)有几列是日期时间类,其中包含NULL值。因此,在执行mutate_allreplace函数时,它会抛出评估错误。为了克服这个问题,我将所有列转换为字符格式,并稍后进行了插补,这对我起作用了。 - Ashish25
1
@AshishSahu 我猜你有一个可能不被支持的 POSIXlt 列。相反,应该使用 POSIXct - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接