【问题标题】:delete rows where amount or rows per group greater than value of grouped dataframe in r删除每组的数量或行数大于 r 中分组数据帧的值的行
【发布时间】:2021-03-23 09:10:28
【问题描述】:

我想删除 ID 号大于长度值的所有行。

Tracks <- c("a","a","a","b","b","b","b","c","c")
Length <- c(2,2,2,1,1,1,1,2,2)
ID <- c(1,2,3,1,2,3,4,1,2)
df <- data.frame(Tracks, Length, ID)

  Tracks Length ID
1      a      2  1
2      a      2  2
3      a      2  3
4      b      1  1
5      b      1  2
6      b      1  3
7      b      1  4
8      c      2  1
9      c      2  2

我使用dplyr包的group_by对我的数据进行分组,打印显示分组成功

df_group <- df %>% group_by(Tracks)
> print(df_group)
# A tibble: 9 x 3
# Groups:   Tracks [3]
  Tracks Length    ID
  <chr>   <dbl> <dbl>
1 a           2     1
2 a           2     2
3 a           2     3
4 b           1     1
5 b           1     2
6 b           1     3
7 b           1     4
8 c           2     1
9 c           2     2

我尝试使用 head 函数,因为这应该会给我最好的结果。为此,我想用一个函数定义 n= 并返回每个组的 Length 的最大值

df2 <- head(df_group, n = max(df$Length))
print(df2)
# A tibble: 2 x 3
# Groups:   Tracks [1]
  Tracks Length    ID
  <chr>   <dbl> <dbl>
1 a           2     1
2 a           2     2

group_modify(df_group, head(df_group, n = max(df$Length)), .keep = TRUE)
Error: Can't convert a `grouped_df/tbl_df/tbl/data.frame` object to function

似乎 head 函数不适用于组,因为它只返回前两行,我尝试了 group_modify 但这也不起作用。

有什么想法可以做到这一点吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    试试subset

    subset(
      df,
      ID <= Length
    )
    

    这会给

      Tracks Length ID
    1      a      2  1
    2      a      2  2
    4      b      1  1
    8      c      2  1
    9      c      2  2
    

    【讨论】:

    • 非常简洁,没有任何包。
    【解决方案2】:

    您可以使用slice 做到这一点:

    library(dplyr)
    
    df %>%  group_by(Tracks) %>% slice(seq_len(max(Length))) %>% ungroup
    
    #  Tracks Length    ID
    #  <chr>   <dbl> <dbl>
    #1 a           2     1
    #2 a           2     2
    #3 b           1     1
    #4 c           2     1
    #5 c           2     2
    

    filter

    df %>%  group_by(Tracks) %>% filter(ID <= max(Length)) %>% ungroup
    

    【讨论】:

    • 感谢 Ronak,它与 slice 完美搭配
    【解决方案3】:
    df_filtered <- df[df$ID <= df$Length, ]
    

    这应该可以完成工作。您始终可以以df[rows,columns] 格式从data.frame 中选择行和列。在这种情况下,逗号后面的空格仅表示“获取所有列”。

    【讨论】:

      【解决方案4】:

      除了现有的非常好的解决方案之外,还可以使用which:我知道逻辑索引是这个答案的一部分(由大卫提供)。

      df1 <- df[which(!ID > Length),]
      
      output:
      > df1
        Tracks Length ID
      1      a      2  1
      2      a      2  2
      4      b      1  1
      8      c      2  1
      9      c      2  2
      

      【讨论】:

        猜你喜欢
        • 2018-09-01
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 2019-01-08
        • 2021-04-10
        • 2020-06-12
        • 2021-10-24
        相关资源
        最近更新 更多