获取R中具有最小值的行

Get row with most minimum values in R

我有这个问题,我这辈子都无法解决。非常感谢您的帮助。

假设我们有这个 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

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

非常感谢,

亚历克斯。

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

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

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

然后我还创建了一个函数,returns 向量中出现最多的元素的值:

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

就是这样。我真的希望这可以帮助别人。