假设我有一个像这样的数据框:
set.seed(4)
df<-data.frame(
group = rep(1:10, each=3),
id = rep(sample(1:3), 10),
x = sample(c(rep(0, 15), runif(15))),
y = sample(c(rep(0, 15), runif(15))),
z = sample(c(rep(0, 15), runif(15)))
)
如上所示,x
、y
、z
向量的某些元素取零值,其余元素取自均匀分布介于 0 和 1 之间。
对于每一组,由第一列确定,我想从第二列中找到三个ID,指向最高值的x
, y
, z
组中的变量。假设除了变量在给定组的所有观察中取值为 0 的情况外没有其他情况 - 在这种情况下,我不想返回任何数字作为具有最大值的行的 ID。
输出看起来像这样:
group x y z
1 2 2 1
2 2 3 1
... .........
我的第一个想法是分别为每个变量选择具有最大值的行,然后使用merge
将其放入一个表中。但是,我想知道它是否可以在没有 merge
的情况下完成,例如使用标准的 dplyr
函数。
最佳答案
这是我使用 plyr
提出的解决方案:
ddply(df,.variables = c("group"),
.fun = function(t){apply(X = t[,c(-1,-2)],MARGIN = 2,
function(z){ifelse(sum(abs(z))==0,yes = NA,no = t$id[which.max(z)])})})
# group x y z
#1 1 2 2 1
#2 2 2 3 1
#3 3 1 3 2
#4 4 3 3 1
#5 5 2 3 NA
#6 6 3 1 3
#7 7 1 1 2
#8 8 NA 2 3
#9 9 2 1 3
#10 10 2 NA 2
关于r - 对于每组,找到具有几列最大值的观察值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45479140/