簡體   English   中英

R max 函數忽略不適用

[英]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的)元素xNA ,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM