以下のようなデータフレームがあります。各行の最大値の列を取得したい。ただし、その行に値9がある場合、その列は値9を無視する必要があります。どうすれば効率的にそれを達成できますか?
df <- data.frame(age=c(5,6,9), marks=c(1,2,7), story=c(2,9,1))
df$max <- apply(df, 1, max)
df
1つの可能性があります。
df$colMax <- apply(df, 1, function(x) max(x[x != 9]))
ここでは、pmax
関数が役立ちます。唯一の問題は、パラメーターとして多数のベクトルを使用することです。 do.call
を使用して、data.frameをパラメーターに変換できます。また、他の人が提案したように9つの値をNAに設定しますが、やや型破りなis.na<-
コマンドを使用して設定します。
do.call(pmax, c(`is.na<-`(df, df==9), na.rm=T))
# [1] 5 6 7
代替9
でNA
を使用し、@ MrFlickの削除された回答で示唆されているようにpmax
を使用します。
df2 <- df #copy df because we are going to change it
df2[df2==9] <- NA
do.call(function(...) pmax(..., na.rm=TRUE), df2)
#[1] 5 6 7
#make a copy of your data.frame
tmp.df <- df
#replace the 9s with NA
tmp.df[tmp.df==9] <- NA
#Use apply to process the data one row at a time through the max function, removing NA values first
apply(tmp.df,1,max,na.rm=TRUE)