【问题标题】:Filter dataframe by slicing group-first values通过切片组优先值过滤数据帧
【发布时间】:2022-01-05 09:49:19
【问题描述】:

在这个数据框中:

df <- data.frame(
  PP_by = c("A","B","A","A","B","B", rep("C",2),"A","A","A","B"),
  Sequ = c(1,1,1,1,1,1,4,4,4,4,4,4),
  Line = c(55,55,77,77,77,77,99,99,99,99,33,33),
  pp = rnorm(12),
  pp2 = c(1.1,1.2,1.1,1.2,1.3,1.5,1.3,1.2,1.5,1.7,1.0,1.9),
  other = 1:12,
  other2 = letters[1:12]
)

我想用SequLine 分组的第一个值对行进行切片。我试过了,但它返回空:

df %>%
   group_by(Sequ) %>%
   slice(first(Line))
# A tibble: 0 × 7
# Groups:   Sequ [0]
# … with 7 variables: PP_by <chr>, Sequ <dbl>, Line <dbl>, pp <dbl>, pp2 <dbl>, other <int>, other2 <chr>

想要的结果是这样的:

df
   PP_by Sequ Line          pp pp2 other other2
1      A    1   55  0.30277770 1.1     1      a
2      B    1   55  1.55909373 1.2     2      b
7      C    4   99  1.33796806 1.3     7      g
8      C    4   99 -0.23230445 1.2     8      h
9      A    4   99 -0.12740409 1.5     9      i
10     A    4   99 -0.02168540 1.7    10      j

【问题讨论】:

    标签: r dplyr filter


    【解决方案1】:

    根据?slice

    slice() 让您可以按(整数)位置索引行。

    first(Line) 是 Line 的第一个值,而不是位置索引。如果我们转换为逻辑然后用which换行,可以得到slice所需的位置索引

    library(dplyr)
    df %>%
      group_by(Sequ) %>%
      slice(which(Line == first(Line))) %>% 
      ungroup
    # A tibble: 6 × 7
      PP_by  Sequ  Line     pp   pp2 other other2
      <chr> <dbl> <dbl>  <dbl> <dbl> <int> <chr> 
    1 A         1    55 -0.664   1.1     1 a     
    2 B         1    55 -0.520   1.2     2 b     
    3 C         4    99 -2.11    1.3     7 g     
    4 C         4    99  0.165   1.2     8 h     
    5 A         4    99  2.43    1.5     9 i     
    6 A         4    99  0.657   1.7    10 j    
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      library(tidyverse)
      df %>%
         group_by(Sequ) %>%
         filter(Line == first(Line))
      

      给出:

      # A tibble: 6 x 7
      # Groups:   Sequ [2]
        PP_by  Sequ  Line     pp   pp2 other other2
        <chr> <dbl> <dbl>  <dbl> <dbl> <int> <chr> 
      1 A         1    55  0.425   1.1     1 a     
      2 B         1    55 -0.744   1.2     2 b     
      3 C         4    99  0.497   1.3     7 g     
      4 C         4    99  1.39    1.2     8 h     
      5 A         4    99  0.685   1.5     9 i     
      6 A         4    99  0.128   1.7    10 j     
      

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 1970-01-01
        • 2021-10-25
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 2015-09-13
        • 2018-08-24
        • 1970-01-01
        相关资源
        最近更新 更多