【问题标题】:Subsetting list of dataframes based on ranked column in dataframes R基于数据框R中的排名列的数据框子集列表
【发布时间】:2020-11-21 02:21:59
【问题描述】:

我有一个数据框列表。我只想对包含分数比第二个排名分数低 10 倍的行的数据帧进行子集化,删除所有其他数据帧。知道如何解决这个问题吗?谢谢!

>Output
$E1
  ID    model   score
  E1      AAA    2
  E1      BBB    100
  E1      CCC    130
  E1      ZZZ    120
  E1      YYY    128

$E2
  ID    model   score
  E2      XXX    130
  E2      ASD    144
  E2      DFE    142
  E2      FGS    145
  E2      GFH    124

首选结果:

>Output_subset
$E1
  ID    model   score
  E1      AAA    2
  E1      BBB    100
  E1      CCC    130
  E1      ZZZ    120
  E1      YYY    128

【问题讨论】:

    标签: r list dataframe subset ranking


    【解决方案1】:

    您可以编写一个函数来检查两个分数之间的条件:

    check_data <- function(df) {
       x <- sort(df$score)
       x[1] < (x[2]/10)
    }
    

    你可以在Filter in base R 中使用这个函数:

    Filter(check_data, Output)
    
    #$E1
    #  ID model score
    #1 E1   AAA     2
    #2 E1   BBB   100
    #3 E1   CCC   130
    #4 E1   ZZZ   120
    #5 E1   YYY   128
    

    keep 中的purrr

    purrr::keep(Output, check_data)
    

    数据

    Output <- list(E1 = structure(list(ID = c("E1", "E1", "E1", "E1", "E1"), 
    model = c("AAA", "BBB", "CCC", "ZZZ", "YYY"), score = c(2L, 
    100L, 130L, 120L, 128L)), class = "data.frame", row.names = c(NA, 
    -5L)), E2 = structure(list(ID = c("E2", "E2", "E2", "E2", "E2"
    ), model = c("XXX", "ASD", "DFE", "FGS", "GFH"), score = c(130L, 
    144L, 142L, 145L, 124L)), class = "data.frame", row.names = c(NA, -5L)))
    

    【讨论】:

      【解决方案2】:

      我们也可以使用来自base Rsapply

      Output[sapply(Output, function(x) 
            with(head(x[order(x$score), ], 2), score[1] < (score[2]/10)))]
      

      数据

      Output <- list(E1 = structure(list(ID = c("E1", "E1", "E1", "E1", "E1"), 
      model = c("AAA", "BBB", "CCC", "ZZZ", "YYY"), score = c(2L, 
      100L, 130L, 120L, 128L)), class = "data.frame", row.names = c(NA, 
      -5L)), E2 = structure(list(ID = c("E2", "E2", "E2", "E2", "E2"
      ), model = c("XXX", "ASD", "DFE", "FGS", "GFH"), score = c(130L, 
      144L, 142L, 145L, 124L)), class = "data.frame", row.names = c(NA, -5L)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-31
        • 2021-12-16
        • 2015-08-09
        • 2018-11-18
        • 1970-01-01
        • 2021-04-25
        • 1970-01-01
        • 2014-03-07
        相关资源
        最近更新 更多