r - 对于每组,找到具有几列最大值的观察值

标签 r dataframe dplyr

假设我有一个像这样的数据框:

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)))
)

如上所示,xyz 向量的某些元素取零值,其余元素取自均匀分布介于 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/

相关文章:

删除只有零的行

r - ggplot 轮廓抖动数据点

r - 按列名对矩阵进行排序

R:根据条件比较和过滤两个数据帧

python - 我如何 "merge"行 groupby 在 Pandas 数据框中具有相同的值?

python - 标记数据框的索引

r - 按组区分采样率

r - 拆分单个变量数据框

r - 计算 R 中的转移概率

r - 将多个列表列组合成 R 中的一个列表列?