【问题标题】:Subset specific rows per group [closed]每组子集特定行[关闭]
【发布时间】:2019-11-27 08:43:15
【问题描述】:

我有一个这样的数据框:

    Group     V2   V3   V4
      1        D    F    W 
      1        T    A    L 
      1        P    F    P 
      2        T    F    L 
      2        R    R    O 
      2        D    Y    L 
      2        D    F    I 
      ...     

我有这样的清单:

 [1]  1 3
 [2]  4
 [3]  2 3 4

列表的每个元素都表示我想为每个组保留哪一行。所以我只想在数据框中保留 Group==1 的第 1 行和第 3 行;第二组第4行;第三组的第 2、3 和 4 行等。

我已经很努力了,但我还没有找到一个简单的方法,尽管我很确定肯定有一个使用 apply 或类似的东西。

【问题讨论】:

    标签: r subset slice apply


    【解决方案1】:

    你可以的,

    do.call(rbind, Map(function(x, y) x[y,], split(df, df$Group), l1))
    #    Group V2 V3 V4
    #1.1     1  D  F  W
    #1.3     1  P  F  P
    #2       2  D  F  I
    

    在哪里,

    l1 <- list(c(1, 3), 4)
    

    【讨论】:

      【解决方案2】:

      使用以下对象,一个 data.frame 和一个列表,类似于你的:

      df <- read.table(text = "Group     V2   V3   V4
            1        D    F    W 
            1        T    A    L 
            1        P    F    P 
            2        T    F    L 
            2        R    R    O 
            2        D    Y    L 
            2        D    F    I
            3        E    F    I
            3        F    F    I
            3        G    F    I
            3        T    F    I", header = T)
      l <- list(c(1, 3), 4, c(2:4))
      
      do.call(rbind, lapply(seq_along(l), function(i) df[df$Group == i,][l[[i]],]))
      #   Group V2 V3 V4
      #1      1  D  F  W
      #3      1  P  F  P
      #7      2  D  F  I
      #9      3  F  F  I
      #10     3  G  F  I
      #11     3  T  F  I
      

      产生与更简单的 data.table 方法相同的结果:

      library(data.table)
      dt <- as.data.table(df)
      dt[, .SD[l[[.GRP]]], Group]
      

      dt[, .SD[l[[unlist(.BY)]]], Group]
      
      #   Group V2 V3 V4
      #1:     1  D  F  W
      #2:     1  P  F  P
      #3:     2  D  F  I
      #4:     3  F  F  I
      #5:     3  G  F  I
      #6:     3  T  F  I
      

      【讨论】:

        【解决方案3】:

        使用tidyverse的选项

        library(tidyverse)
        df %>% 
           group_split(Group) %>% 
           map2_df(l, ~ .x %>% 
                          slice(.y))
        # A tibble: 6 x 4
        #  Group V2    V3    V4   
        #  <int> <fct> <fct> <fct>
        #1     1 D     F     W    
        #2     1 P     F     P    
        #3     2 D     F     I    
        #4     3 F     F     I    
        #5     3 G     F     I    
        #6     3 T     F     I    
        

        数据

        df <- structure(list(Group = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
        3L, 3L), V2 = structure(c(1L, 7L, 5L, 7L, 6L, 1L, 1L, 2L, 3L, 
        4L, 7L), .Label = c("D", "E", "F", "G", "P", "R", "T"), class = "factor"), 
            V3 = structure(c(2L, 1L, 2L, 2L, 3L, 4L, 2L, 2L, 2L, 2L, 
            2L), .Label = c("A", "F", "R", "Y"), class = "factor"), V4 = structure(c(5L, 
            2L, 4L, 2L, 3L, 2L, 1L, 1L, 1L, 1L, 1L), .Label = c("I", 
            "L", "O", "P", "W"), class = "factor")), class = "data.frame", 
           row.names = c(NA, 
        -11L))
        
        l <- list(c(1, 3), 4, 2:4)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-01
          • 1970-01-01
          • 2018-06-06
          • 1970-01-01
          • 1970-01-01
          • 2014-11-16
          • 2016-07-03
          相关资源
          最近更新 更多