[英]R max function ignore NA
我有以下工作代碼。 當我在不同的數據集上復制相同的東西時,我得到了錯誤:(
#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
似乎已經在評論中指出了這個問題。 由於某些向量僅包含NA
s, -Inf
報告了-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
這樣的語句 test <- NA; test==NA
將給出NA
作為結果(而不是TRUE
,如is.na(test)
返回的is.na(test)
),有時可以這樣說,因為缺少值,你怎么知道這兩個缺失值是相同的? 然而,在這種情況下, max
返回-Inf
因為它被賦予了一個空集,我認為這並不明顯。 我的經驗是,如果出現奇怪和意外的結果,通常會涉及NA
或空集。
在以下情況下:
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
您可以使用hablar::max_
返回NA
如果所有的值都是NA
apply(df, 1, function(x) hablar::max_(x[x!=9]))
#[1] 5 NA 7
數據
df <- structure(list(age = c(5, NA, 9), marks = c(-5, NA, 7), story = c(2,
9, NA)), row.names = c(NA, -3L), class = "data.frame")
df
# age marks story
#1 5 -5 2
#2 NA NA 9
#3 9 7 NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.