【问题标题】:group by and find first change in value of group of columns in R分组并找到R中列组值的第一个变化
【发布时间】:2021-02-13 06:03:56
【问题描述】:

我在 R 中有一个按 id 分组的数据框。 “value3”列始终具有正值。我想获取第一行,其中其他列的每个 id 都有非零条目。

例如:

给定以下数据集

structure(list(id = c(1, 1, 1, 4, 4, 4, 4, 6, 6, 6), value1 = c(0,10, 10, 0, 20, 20, 8, 0, 10, 10), value2 = c(0, 30, 10, 0, 0,0, 10, 20, 20, 15), value3 = c(10, 10, 10, 10, 10, 10, 10, 10,10, 10)), class= "data.frame", row.names = c(NA, -10L))

想要的结果是

structure(list(resid = c(1, 4, 6), resvalue1 = c(10, 20, 0),resvalue2 = c(30, 0, 20), resvalue3 = c(10, 10, 10)), class = "data.frame", row.names = c(NA,-3L))

我一直在使用 dplyr 进行切片和选择,但我无法弄清楚这个特殊问题。任何帮助表示赞赏。

【问题讨论】:

    标签: r


    【解决方案1】:

    替代使用data.table:

    library(data.table)
    
    input <- structure(list(id = c(1, 1, 1, 4, 4, 4, 4, 6, 6, 6), value1 = c(0,10, 10, 0, 20, 20, 8, 0, 10, 10), value2 = c(0, 30, 10, 0, 0,0, 10, 20, 20, 15), value3 = c(10, 10, 10, 10, 10, 10, 10, 10,10, 10)), class= "data.frame", row.names = c(NA, -10L))
    
    dt <- as.data.table(input)
    
    output <- dt[, any(value1:value2 != 0), by = id:value3][V1 == TRUE, .SD[1], by = id, .SDcols = !V1:V1]
    

    产生:

       id value1 value2 value3
    1:  1     10     30     10
    2:  4     20      0     10
    3:  6      0     20     10
    

    【讨论】:

      【解决方案2】:

      根据'id'、select对数据列'value1'、'value2'进行分组后,得到逻辑矩阵的rowSums&gt; 0,将其转换为逻辑向量,得到第一个TRUE值的索引(which) 到slice

      library(dplyr)    
      df1 %>% 
          group_by(id) %>%
          slice(which(rowSums(select(cur_data(), value1:value2) > 0) > 0)[1]) %>%
          ungroup
      

      -输出

      # A tibble: 3 x 4
      #     id value1 value2 value3
      #  <dbl>  <dbl>  <dbl>  <dbl>
      #1     1     10     30     10
      #2     4     20      0     10
      #3     6      0     20     10
      

      【讨论】:

        猜你喜欢
        • 2020-03-21
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多