【问题标题】:Replace integer(0) by NA用 NA 替换 integer(0)
【发布时间】:2014-02-08 16:20:17
【问题描述】:

我有一个函数应用于一列并将结果放在另一列中,它有时会给我integer(0) 作为输出。所以我的输出列会是这样的:

45
64
integer(0)
78

如何检测这些integer(0) 并将它们替换为NA?有没有类似is.na() 的东西可以检测到它们?


编辑:好的,我想我有一个可重现的例子:

df1 <-data.frame(c("267119002","257051033",NA,"267098003","267099020","267047006"))
names(df1)[1]<-"ID"

df2 <-data.frame(c("257051033","267098003","267119002","267047006","267099020"))
names(df2)[1]<-"ID"
df2$vals <-c(11,22,33,44,55)

fetcher <-function(x){
  y <- df2$vals[which(match(df2$ID,x)==TRUE)]
return(y) 
}

sapply(df1$ID,function(x) fetcher(x))

sapply 的输出是问题的根源。

> str(sapply(df1$ID,function(x) fetcher(x)))
List of 6
$ : num 33
$ : num 11
$ : num(0) 
$ : num 22
$ : num 55
$ : num 44

我不希望这是一个列表 - 我想要一个向量,而不是 num(0) 我想要 NA (注​​意在这个玩具数据中它给出了num(0) - 在我的真实数据中它给出了@987654333 @)。

【问题讨论】:

  • 将 data.frame$column[data.frame$column == integer(0) ]
  • @pepsimax 你为什么不把它作为答案(也许提供一个工作示例)?
  • 数据框不能包含integer(0)。请提供一个可重现的例子。
  • 或者您可以查看length()==0 参见:stackoverflow.com/questions/6451152/how-to-catch-integer0
  • 我也很想知道integer(0) 是如何进入你的输出的。但要让你继续:要测试一个对象是否是integer(0),你可以做identical(object, integer(0))

标签: r integer transformation


【解决方案1】:

这是一种方法,可以 (a) 将 integer(0) 替换为 NA 并 (b) 将列表转换为向量。

# a regular data frame
> dat <- data.frame(x = 1:4)
# add a list including integer(0) as a column
> dat$col <- list(45,
+                 64,
+                 integer(0),
+                 78)
> str(dat)
'data.frame':   4 obs. of  2 variables:
 $ x  : int  1 2 3 4
 $ col:List of 4
  ..$ : num 45
  ..$ : num 64
  ..$ : int 
  ..$ : num 78
# find zero-length values
> idx <- !(sapply(dat$col, length))
# replace these values with NA
> dat$col[idx] <- NA
# transform list to vector
> dat$col <- unlist(dat$col)
# now the data frame contains vector columns only
> str(dat)
'data.frame':   4 obs. of  2 variables:
 $ x  : int  1 2 3 4
 $ col: num  45 64 NA 78

【讨论】:

  • 谢谢斯文!通过将部分问题合并到我的函数中来解决我的问题!非常感谢大家 - 为糟糕的原始问题道歉!
【解决方案2】:

最好在您的函数中执行此操作,我将其命名为 myFunctionForApply,但这是您当前的函数。返回前检查长度,如果为0则返回NA

myFunctionForApply <- function(x, ...) {
    # Do your processing
    # Let's say it ends up in variable 'ret':
    if (length(ret) == 0)
        return(NA)
    return(ret)
}

【讨论】:

  • 正确。相当不习惯的代码,虽然:function (x, ...) if (length(ret) == 0) NA else ret
  • 感谢本和康拉德!感谢您的回答!
  • 谢谢 Calimo,我现在意识到你已经回答并且 Ben 编辑了
猜你喜欢
  • 2020-02-22
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2014-11-30
  • 2012-06-17
  • 2021-07-02
相关资源
最近更新 更多