我有以下工作代码.当我在不同的数据集上复制相同的东西时,我得到错误:(
#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
Run Code Online (Sandbox Code Playgroud)
我试图在更大的数据上做同样的事情,我收到警告,为什么?
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
Run Code Online (Sandbox Code Playgroud)
为了更好地理解问题,我做了如下更改,但仍然收到警告
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
Run Code Online (Sandbox Code Playgroud)
cof*_*nky 10
似乎已经在评论中指出了这个问题.由于某些向量仅包含NAs,-Inf因此我会从您不喜欢的注释中获取.在这个答案中,我想指出一种可能的方法来解决这个问题,即建立一个控制语句(而不是在-Inf事后重写,这同样有效).例如,
my.max <- function(x) ifelse( !all(is.na(x)), max(x, na.rm=T), NA)
Run Code Online (Sandbox Code Playgroud)
这个伎俩.如果每个(all中)元素x是NA,然后NA返回,以及max其他.如果您想要返回任何其他值,只需交换NA该值.您也可以轻松地将其构建到您的apply-function中.例如
maindata$max_pc_age <- apply(maindata[,c(paste("Q2",1:18,sep="_"))], 1, my.max)
Run Code Online (Sandbox Code Playgroud)
我仍然有时会对R NA和空集治疗感到困惑.这样的陈述 test <- NA; test==NA会给出NA结果(而不是TRUE返回is.na(test)),这有时会通过说因为缺少值而合理化,你怎么知道这两个缺失的值是相同的?但是,在这种情况下,max返回-Inf因为它被赋予一个空集,我认为这一点并不明显.我的经验是,如果弹出奇怪和意外的结果,NA通常会涉及到s或空集.