【问题标题】:Group column in blocks of 4 observations and return 1 based on a condition将列分组为 4 个观察块并根据条件返回 1
【发布时间】:2017-03-19 11:40:12
【问题描述】:

这是我的示例 data.frame:

    df = read.table(text = 'Value
    1
    1
    0
    1
    0
    0
    0
    0
    0
    0
    1
    1
    1
    0
    1
    1
    0
    0
    0
    0', header = TRUE)

我需要将列分成 4 个块,如果每个块中至少存在一个 1,我需要返回一个带有 1s 的 data.frame。

这是我的预期结果:

Result
1
1
1

或者也返回一个带有 1 和 0 的 data.frame,其中没有 1 的块打印 0:

Result
1
0
1
1
0

【问题讨论】:

    标签: r dataframe grouping


    【解决方案1】:

    一种简单的矢量化方式可能是转换为 4 行矩阵,然后运行 ​​colSums(这当然假设您的数据长度可被 4 整除)

    as.integer(colSums(matrix(df$Value, 4)) > 0)
    # [1] 1 0 1 1 0
    

    或者使用 matrixStats 包

    matrixStats::colMaxs(matrix(df$Value, 4))
    # [1] 1 0 1 1 0
    

    【讨论】:

      【解决方案2】:

      data.table

      library(data.table)
      setDT(df)[, grp := as.integer(gl(.N, 4, .N))][, +(any(Value==1)) , grp]$V1
      #[1] 1 0 1 1 0
      

      或与rowsum 来自base R

      +(rowsum(df$Value, gl(20, 4, 20))>0)
      

      或者tidyverse

      library(dplyr)
      df %>%
          group_by(grp = gl(n(), 4, n())) %>%
          summarise(Value = max(Value))
      

      【讨论】:

        【解决方案3】:

        这里是一个base R方法,使用矩阵乘法计算1个值的和,然后使用sign将大于1的值转换为0。

        sign(rep(1, 4) %*% matrix(df$Value, 4))
             [,1] [,2] [,3] [,4] [,5]
        [1,]    1    0    1    1    0
        

        请注意,这假定向量由 0 和 1 组成。如果有负数,它可能会失败。

        【讨论】:

          猜你喜欢
          • 2019-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 2018-09-29
          • 2016-11-16
          • 2019-02-25
          • 1970-01-01
          相关资源
          最近更新 更多