一个完全基本的问题 - 如果重复,请原谅我。
set.seed(1)
df <-
data.frame(id=c('a', 'a', 'b', 'b', 'a'),
a=sample(1:10, size=5, replace=T),
b=sample(1:10, size=5, replace=T),
c=sample(1:10, size=5, replace=T))
Then,
> df
id a b c
1 a 3 9 3
2 a 4 10 2
3 b 6 7 7
4 b 10 7 4
5 a 3 1 8
返回具有最大值的列名(a、b 或 c),如果它在id
变量取第二高,我使用下面的函数。
FUN <- function(r) {
top <- names(r[,c('a', 'b', 'c')])[order(r[,c('a', 'b', 'c')], decreasing=T)]
ifelse(top[1] == r[['id']], top[2], top[1])
}
我可以:
FUN(df[1,]) #[1] "b"
对于所有行:
res <- NULL
for(i in 1:nrow(df)) {
res <- c(res, FUN(df[i,]))
}
And get
> res
[1] "b" "b" "c" "a" "c"
但我怎样才能apply
这 ?例如。这不起作用:
apply(df, 1, FUN)
我怀疑问题在于FUN
假设一个 1 行数据框(而不是像(第一行)这样的命名字符向量)
id a b c
"a" "3" "9" "c"
From apply?
:
如果 X 不是数组,而是具有非空暗淡值的类的对象(例如数据框),则应用尝试通过 as.matrix 将其强制转换为数组(如果它是二维的)(例如,数据帧)或通过 as.array。