【问题标题】:How can I extract a subset of data based on another data frame and grab observations before and after that subset如何根据另一个数据框提取数据子集并在该子集之前和之后获取观察结果
【发布时间】:2021-07-27 22:01:07
【问题描述】:

我有两个数据框。 df_sub 是主数据框 df 的子集。我想根据 df_sub 获取 df 的一个子集,其中生成的数据帧将是 df_sub 加上之前和之后发生的观察结果。

例如,考虑两个数据集

df <- data.frame(var1 = c("a", "x", "x", "y", "z", "t"),
                    var2 = c(4, 1, 2, 45, 56, 89))
  
df_sub <- data.frame(var1 = c("x", "y"),
                       var2 = c(2, 45))

他们看起来像

> df
  var1 var2
1    a    4
2    x    1
3    x    2
4    y   45
5    z   56
6    t   89

> df_sub
  var1 var2
1    x    2
2    y   45

我想要的结果是

> df_result
2    x    1
3    x    2
4    y   45
5    z   56

我正在考虑使用 inner_join 或类似的东西

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用 match 获取索引,然后在这些索引上加或减 1,获取 unique 并对行进行子集化

    v1 <- na.omit(match(do.call(paste, df_sub), do.call(paste, df)) )
    df[unique(v1 + rep(c(-1, 0, 1), each = length(v1))),]
    

    -输出

      var1 var2
    2    x    1
    3    x    2
    4    y   45
    5    z   56
    

    或者在'df_sub'中创建一个'flag'列,做一个left_join,然后根据'flag'的lead/lagfilter

    library(dplyr)
    df %>% 
        left_join(df_sub %>%
              mutate(flag = TRUE)) %>%
         filter(flag|lag(flag)|lead(flag)) %>%
         select(-flag)
      var1 var2
    1    x    1
    2    x    2
    3    y   45
    4    z   56
    

    【讨论】:

      【解决方案2】:

      您可以创建一个行号来跟踪通过连接选择的行。通过包括最小行数 - 1 和最大行数 + 1 来对数据进行子集。

      library(dplyr)
      
      tmp <- df %>%
        mutate(row = row_number()) %>%
        inner_join(df_sub, by = c("var1", "var2"))
      
      df[c(min(tmp$row) - 1, tmp$row, max(tmp$row) + 1), ]
      
      #  var1 var2
      #2    x    1
      #3    x    2
      #4    y   45
      #5    z   56
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-20
        • 2019-09-24
        • 1970-01-01
        • 2013-07-12
        • 2015-08-23
        • 2011-11-20
        • 2013-04-16
        • 2023-01-19
        相关资源
        最近更新 更多