这是我的示例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
答案 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组成。如果有负数,可能会失败。