以4个观察值为一组对列进行分组,并根据条件返回1

时间:2017-03-09 10:51:57

标签: r dataframe grouping

这是我的示例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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用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))

答案 2 :(得分:0)

这是一个基本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组成。如果有负数,可能会失败。