我有一个如下数据框。我想为每一行获得一列最大值。但是如果该列存在于该行中,则该列应忽略值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
答案 0 :(得分:20)
这是一种可能性:
df$colMax <- apply(df, 1, function(x) max(x[x != 9]))
答案 1 :(得分:15)
pmax
函数在这里很有用。唯一的问题是它需要一堆向量作为参数。您可以将data.frame转换为do.call
的参数。我也按照其他人的建议将9个值设置为NA,但是使用了一些非常规的is.na<-
命令。
do.call(pmax, c(`is.na<-`(df, df==9), na.rm=T))
# [1] 5 6 7
答案 2 :(得分:3)
将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
答案 3 :(得分:1)
#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)