R max函数忽略NA

时间:2014-07-01 21:49:40

标签: r max

我有以下工作代码。当我在不同的数据集上复制相同的东西时,我会得到错误:(

#max by values
df <- data.frame(age=c(5,NA,9), marks=c(1,2,7), story=c(2,9,NA))
df

df$colMax <- apply(df[,1:3], 1, function(x) max(x[x != 9],na.rm=TRUE))
df

我试图在更大的数据上做同样的事情,我收到警告,为什么?

maindata$max_pc_age <- apply(maindata[,c(paste("Q2",1:18,sep="_"))], 1, function(x) max(x[x != 9],na.rm=TRUE))


50: In max(x[x != 9], na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf

为了更好地理解问题,我做了如下更改,但仍然收到警告

maindata$max_pc_age <- apply(maindata[,c(paste("Q2",1:18,sep="_"))], 1, function(x) max(x,na.rm=TRUE))
1: In max(x, na.rm = TRUE) : no non-missing arguments to max; returning -Inf

2 个答案:

答案 0 :(得分:10)

似乎已经在评论中指出了这个问题。由于某些向量仅包含NA s,因此会报告-Inf,这是我从您不喜欢的评论中获取的。在这个答案中,我想指出一种可能的方法来解决这个问题,即建立一个控制语句(而不是在事实之后覆盖-Inf,这同样有效)。例如,

 my.max <- function(x) ifelse( !all(is.na(x)), max(x, na.rm=T), NA)

这个伎俩。如果all中的每个{x)元素都为NA,则返回NA,否则返回max。如果您想要返回任何其他值,只需为该值交换NA即可。您也可以轻松地将其构建到apply - 函数中。例如。

 maindata$max_pc_age <- apply(maindata[,c(paste("Q2",1:18,sep="_"))], 1, my.max)

我仍然有时会对R NA和空集治疗感到困惑。像test <- NA; test==NA这样的语句会给NA作为结果(而不是TRUE所返回的is.na(test)),有时会通过说因为缺少值来合理化,你能知道这两个缺失的值是一样的吗?但是,在这种情况下,max返回-Inf,因为它被赋予一个空集,我认为这一点并不明显。我的经验是,如果弹出奇怪和意外的结果,通常会涉及NA或空集。

答案 1 :(得分:1)

如下所示:

df[2,2] <- NA
df[1,2] <- -5

apply(df, 1, function(x) max(x[x != 9],na.rm=TRUE))
#[1]    5 -Inf    7
#Warning message:
#In max(x[x != 9], na.rm = TRUE) :
#  no non-missing arguments to max; returning -Inf

你可以这样做:

df1 <- df  
minVal <- min(df1[!is.na(df1)])-1

df1[is.na(df1)|df1==9] <- minVal
val <- do.call(`pmax`, df1)
val[val==minVal] <- NA
val
#[1]  5 NA  7