我有这个问题,对于我的生活,我一直无法解决。一些帮助将受到高度赞赏。
假设我们有这个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。
答案 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
关于它。我真的希望这可以帮助别人。