【发布时间】:2017-06-16 14:02:33
【问题描述】:
一个完全基本的问题 - 如果它是重复的,请原谅我。
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))
那么,
> 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,]))
}
得到
> res
[1] "b" "b" "c" "a" "c"
但是我怎么能apply这个呢?例如。这不起作用:
apply(df, 1, FUN)
我怀疑问题在于 FUN 假定一个 1 行数据框(而不是一个命名的字符向量,如(第一行))
id a b c
"a" "3" "9" "c"
来自apply?:
如果 X 不是数组,而是具有非 null 暗值的类的对象(例如数据框),则应用尝试通过 as.matrix 将其强制转换为二维数组(例如, 一个数据框) 或通过 as.array.
【问题讨论】:
-
你必须使用那个功能吗?或者您是否正在寻找获取最大列数的方法?
-
我试图了解,一般来说,如何使用期望数据帧行的函数按行执行操作。
标签: r function dataframe row apply