获取R中包含最大值的行

时间:2015-12-22 11:39:53

标签: minimum

我有这个问题,对于我的生活,我一直无法解决。一些帮助将受到高度赞赏。

假设我们有这个data.frame:

Session <- c("A", "B", "C", "A", "B", "A")
V1 <- c(1, 1, 2, 3, 2, 4)
V2 <- c(1, 1, 2, 1, 1, 3)
V3 <- c(3, 1, 2, 3, 2, 2)
df <- data.frame(Session, V1, V2, V3)
df
  Session V1 V2 V3
1       A  1  1  3
2       B  1  1  1
3       C  2  2  2
4       A  3  1  3
5       B  2  1  2
6       A  4  3  2

我想通过变量Session获取每列 GROUPED MOST 最小值的行。

在这种情况下,预期的输出如下:

  Session V1 V2 V3
1       A  1  1  3
2       B  1  1  1
3       C  2  2  2

如果每个变量的多个行具有相同数量的最小值,则一行应该足够有效。

非常感谢,

Aleix。

1 个答案:

答案 0 :(得分:0)

好的,我找到了一种方法,我很确定是最好的方式。如果您可以改进此解决方案,请执行。

首先,我从 df 对象创建了一个data.table:

library(data.table)
dt <- setDT(df)

然后我还创建了一个函数,它返回向量中最当前元素的值:

most <- function(a1){ return(as.integer(names(sort(table(a1), decreasing = TRUE))[1]))}

为了测试它,我执行了以下操作:

most(c(1,2,3,3,3,2,1))
[1] 3

然后我搜索了包含每列最小值的行:

mins <- dt[, list(.I[which.min(V1)], .I[which.min(V2)], .I[which.min(V3)] ), by = "Session"]
mins
   Session V1 V2 V3
1:       A  1  1  6
2:       B  2  2  2
3:       C  3  3  3

最后,我使用上一个结果在原始data.table对象( dt )上搜索这些行,如下所示:

result <- dt[apply(mins[,, by=c("Session")], FUN = max_mins, MAR = 1)]
result
   Session V1 V2 V3
1:       A  1  1  3
2:       B  1  1  1
3:       C  2  2  2

关于它。我真的希望这可以帮助别人。