【问题标题】:Function to change blanks to NA将空白更改为 NA 的功能
【发布时间】:2017-03-15 17:03:35
【问题描述】:

我正在尝试编写一个将空字符串转换为 NA 的函数。我的一个专栏的摘要如下所示:

      a   b 
 12 210 468 

我想将 12 个空值更改为 NA。我还有一些其他因素列,我想将它们的空值更改为 NA,所以我从这里和那里借了一些东西来想出这个:

# change nulls to NAs
nullToNA <- function(df){

  # split df into numeric & non-numeric functions
  a<-df[,sapply(df, is.numeric), drop = FALSE]
  b<-df[,sapply(df, Negate(is.numeric)), drop = FALSE]

  # Change empty strings to NA
  b<-b[lapply(b,function(x) levels(x) <- c(levels(x), NA) ),] # add NA level
  b<-b[lapply(b,function(x) x[x=="",]<- NA),]                 # change Null to NA

  # Put the columns back together
  d<-cbind(a,b)
  d[, names(df)]
}

但是,我收到了这个错误:

> foo<-nullToNA(bar)  
Error in x[x == "", ] <- NA : incorrect number of subscripts on matrix  
Called from: FUN(X[[i]], ...)

我已尝试在此处找到答案:Replace all 0 values to NA,但它会将我的所有列更改为数值。

【问题讨论】:

  • 为什么不用is.null() 函数而不是x==""?也许什么都找不到。您是否检查过您的levels 是否返回任何内容。您可以使用数据逐步检查函数的内部。忽略函数并在函数内部逐行处理数据。

标签: r function na missing-data


【解决方案1】:

这是我用来解决这个问题的函数。

null_na=function(vector){
  new_vector=rep(NA,length(vector))
  for(i in 1:length(vector))
    if(vector[i]== ""){new_vector[i]=NA}else if(is.na(vector[i])) 
      {new_vector[i]=NA}else{new_vector[i]=vector[i]}
  return(new_vector)
}

只需插入您遇到问题的列或向量即可。

【讨论】:

    【解决方案2】:

    这对我有用

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

    【讨论】:

      【解决方案3】:

      您可以直接索引符合逻辑标准的字段。所以你可以写:

      df[is_empty(df)] = NA
      

      is_empty 是您的比较对象,例如df == "":

      df[df == ""] = NA
      

      但请注意,is.null(df) 不起作用,而且无论如何都会很奇怪1。不过,我建议不要合并不同类型列的逻辑!而是分开处理。


      1 你几乎不会在表中遇到NULL,因为只有当底层向量是list 时才有效。您可以使用此约束创建矩阵和 data.frames,但 is.null(df) 永远不会是 TRUE,因为 NULL 值包含在列表中。

      【讨论】:

      • is_empty 不是函数,但我使用了b[b==""] = NA 并且有效。
      • @TravisHeeter 我使用is_empty 作为任意占位符。
      • 将上述解决方案改编为:df[df == "NULL"]
      【解决方案4】:

      怎么样:

      df[apply(df, 2, function(x) x=="")] = NA
      

      对我来说很好,至少在简单的例子中。

      【讨论】:

      • (1)""NULL! (2) 不需要apply
      • 同意 (2),我把它复杂化了 :) 但是你甚至可以在 R 向量中有 NULL 值吗?.. 无论如何,OP 的示例函数正在寻找空字符串,所以我认为这就是他想要的替换。
      • 诚然,在表格中具有NULL 值的情况很少见。它仅在底层(列)向量是list 时才有效。
      • 不那么奇怪了,至少现在不那么奇怪了。 tidyverse 函数pivot_wider 将 NULL 用于缺失值。
      猜你喜欢
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 2023-03-20
      • 2013-11-04
      • 1970-01-01
      • 2014-04-26
      相关资源
      最近更新 更多