我有以下工作代码。当我在不同的数据集上复制相同的东西时,我会得到错误:(
#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
答案 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