请求逐行解释统计向量正数值组数的R代码
逐行解释统计向量连续正数值组数的R代码
首先明确目标:统计graduation$zx1向量中连续正数值的独立组数(比如c(2,3,-1,4,5,6,-2,7)里有3组连续正数)。假设你的核心代码如下:
# 提取目标向量 zx1 <- graduation$zx1 # 标记每个元素是否为正数 is_positive <- zx1 > 0 # 构建分组标识groups1 groups1 <- cumsum(c(TRUE, diff(is_positive) != 0))[is_positive] # 按分组拆分正数序列 positive_groups <- split(zx1[is_positive], groups1) # 统计组数 num_positive_groups <- length(positive_groups)
以下是逐行详细解释:
zx1 <- graduation$zx1:从数据框graduation中提取名为zx1的向量,赋值给变量zx1,简化后续操作的代码书写。is_positive <- zx1 > 0:生成与zx1长度一致的逻辑向量,每个元素对应zx1对应位置的数值是否为正(正数对应TRUE,非正数对应FALSE)。比如zx1 = c(2,-1,3,4)时,is_positive结果为c(TRUE, FALSE, TRUE, TRUE)。groups1 <- cumsum(c(TRUE, diff(is_positive) != 0))[is_positive]:这是分组逻辑的核心,拆解来看:diff(is_positive):计算逻辑向量的差分(R中逻辑值TRUE=1、FALSE=0)。当相邻元素的正负状态变化时,差分结果不为0;状态不变时为0。比如上述is_positive的差分结果是c(-1,1,0)。diff(is_positive) != 0:将差分结果转换为逻辑向量,状态变化的位置为TRUE,不变为FALSE,此处结果为c(TRUE, TRUE, FALSE)。c(TRUE, diff(is_positive) != 0):在开头补一个TRUE,让向量长度和原始is_positive一致(因为diff会让向量长度减1),此处变为c(TRUE, TRUE, TRUE, FALSE)。cumsum(...):对该逻辑向量做累加求和,每遇到TRUE就会让计数加1,从而给每一段连续相同状态的元素分配唯一组号,此处累加结果为c(1,2,3,3)。[is_positive]:仅保留is_positive为TRUE位置的组号,也就是只给正数元素分配组号。上述例子的结果是c(1,3,3),对应原向量中的2(组1)、3和4(组3)。
positive_groups <- split(zx1[is_positive], groups1):把所有正数元素按groups1的组号拆分,每个组对应一段连续的正数序列。上述例子会得到列表:list("1"=2, "3"=c(3,4))。num_positive_groups <- length(positive_groups):统计列表的长度,也就是连续正数的组数,上述例子结果为2。
内容的提问来源于stack exchange,提问作者bluewaves
相关产品推荐
相关产品推荐

