获取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
就是这样。我真的希望这可以帮助别人。
我有这个问题,我这辈子都无法解决。非常感谢您的帮助。
假设我们有这个 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
就是这样。我真的希望这可以帮助别人。