【问题标题】:Get row with most minimum values in R获取R中最小值最多的行
【发布时间】:2015-12-24 16:02:49
【问题描述】:

我有这个问题,我这辈子都无法解决。一些帮助将不胜感激。

假设我们有这个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 获取每列 GROUPEDMOST 最小值的行。

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

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

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

非常感谢,

阿莱克斯。

【问题讨论】:

    标签: minimum


    【解决方案1】:

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

    首先我从 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
    

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

    【讨论】:

      猜你喜欢
      • 2021-05-09
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多