R语言纵向数据处理:按ID分组将A列首次1之后的观测全部填充为1
实现思路
核心逻辑为:按ID分组后,计算A列的累计最大值。因为A列取值仅为0/1,首次出现1之后累计最大值会一直保持为1,刚好匹配需求规则。
各工具实现代码
Python(pandas)
如果你的数据存为pandas的DataFrame,一行代码即可实现:
import pandas as pd df['B'] = df.groupby('ID')['A'].cummax()
R(dplyr)
用dplyr的分组操作和累计最大值函数实现:
library(dplyr) df <- df %>% group_by(ID) %>% mutate(B = cummax(A)) %>% ungroup()
SQL
用窗口函数先定位每个ID首次出现1的行位置,再做判断赋值:
SELECT t1.*, CASE WHEN row_number() OVER(PARTITION BY ID ORDER BY 排序字段) >= first_1_pos THEN 1 ELSE 0 END AS B FROM ( SELECT *, MIN(CASE WHEN A = 1 THEN row_number() OVER(PARTITION BY ID ORDER BY 排序字段) END) OVER(PARTITION BY ID) AS first_1_pos FROM 你的表名 ) t1
注意:SQL语句里的排序字段需要替换为你表中确定行顺序的字段,比如时间戳、行序号等,没有固定排序规则的话无法确定"首次出现"的位置。
效果验证示例
输入样例:
| ID | A |
|---|---|
| 1 | 0 |
| 1 | 0 |
| 1 | 1 |
| 1 | 0 |
| 2 | 0 |
| 2 | 1 |
| 2 | 1 |
输出结果:
| ID | A | B |
|---|---|---|
| 1 | 0 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
| 1 | 0 | 1 |
| 2 | 0 | 0 |
| 2 | 1 | 1 |
| 2 | 1 | 1 |
内容的提问来源于stack exchange,提问作者Statistix
相关产品推荐
相关产品推荐

