在R数据表中读取空白作为缺失(NA)

在R数据表中读取空白作为缺失(NA),r,function,data.table,R,Function,Data.table,我试图创建一个函数,可以找到缺失的位置,并在数据表中填充缺失的位置。现在,该函数广泛使用is.na查找缺失位置,并用插补值替换。它适用于所有类型的变量,直到输入为字符类型列且空白单元格缺失,因为is.na无法将其识别为缺失,因此它跳过这些单元格进行插补 例如: library(data.table) t<-data.table(x=c('an','ax','','az'),y=c('bn','','bz','bx')) x y 1: an

我试图创建一个函数,可以找到缺失的位置,并在数据表中填充缺失的位置。现在,该函数广泛使用is.na查找缺失位置,并用插补值替换。它适用于所有类型的变量,直到输入为字符类型列且空白单元格缺失,因为is.na无法将其识别为缺失,因此它跳过这些单元格进行插补

例如:

    library(data.table)
    t<-data.table(x=c('an','ax','','az'),y=c('bn','','bz','bx'))
          x  y
      1: an bn
      2: ax      
      3:    bz 
      4: az bx
      is.na(t[,x])
      [1] FALSE FALSE FALSE FALSE
非常感谢您的帮助

谢谢。

您可以像这样使用fast nzchar:

is.na(x) | !nzchar(x) 
例如:

x <- c(NA,'','a')
is.na(x) | !nzchar(x) 
## [1]  TRUE  TRUE FALSE

另一个使用条件赋值的解决方案使用i:


请给出一个小的可复制示例和预期结果。有关指南,请查看。如果你已经失踪了。那么yourdf$yourCol==应该给出逻辑上的TRUE/FALSE,因为我认为这不适用于数据表。我试图在我的数据表上使用您的代码,但它给出了相同的结果。nzchartest_dt[1]正确,尽管它非常适合矢量类型输入。@Anuj这就是为什么您应该给出一个可复制的示例,以获得所需的输出。即使你们后来做了,但你们的例子仍然是不可复制的。您可以使用dput添加数据吗?请花点时间阅读你问题下方评论中的链接。与其说ifelse的速度慢,不如用replacex,whichis.nax |!Nzharx,'some value'@agstudy关于它速度慢的说法是基于里卡多·萨波尔塔(Ricardo Saporta)在这里的帖子:我认为它实际上不适用于你的答案,但更适用于像ifelsecond这样的情况,昂贵的计算,昂贵的计算2,因为两种昂贵的计算都必须全部进行,即使只使用了其中的一部分。哦,事实上,这里有一个与你类似的例子的基准,它的10倍是慢的:x
x <- c(NA,'','a')
is.na(x) | !nzchar(x) 
## [1]  TRUE  TRUE FALSE
tt <- data.table(x=c('an','ax','','az'),y=c('bn','','bz','bx'))
tt[, lapply(.SD,
            function(x)
              ifelse(is.na(x) | !nzchar(x),'some value',x)) ]

           x          y
1:         an         bn
2:         ax some value
3: some value         bz
4:         az         bx
DT <- data.table(x = c('an','ax','','az',NA),
                 y = c(NA,'bn','','bz','bx'))
DT[x %in% c(NA, ""), x := 'some value']
DT[y %in% c(NA, ""), y := 'some value']
            x          y
1:         an some value
2:         ax         bn
3: some value some value
4:         az         bz
5: some value         bx