纵向个体读数数据集分组单行汇总:生成二进制标识变量
解决方案:按个体汇总纵向数据为二进制变量
搞定这个需求核心就是按个体分组,检查组内是否存在任意一条diff值大于5的记录,下面用两种常用的数据处理工具来实现:
R 实现(用dplyr包)
如果你的数据是数据框格式,用dplyr的分组汇总功能就能轻松搞定:
library(dplyr) # 先构造你的输入数据(如果已有数据框可以跳过这步) df <- tibble( individual = c("A", "A", "A", "A", "B", "B", "B", "B"), val1 = c(32, 36, 28, 26, 65, 58, 57, 54), val2 = c(36, 28, 26, 26, 64, 59, 54, 51), diff = c(-4, 8, 2, 0, 1, -1, 3, 3) ) # 按个体分组,判断是否存在diff>5的记录 result <- df %>% group_by(individual) %>% summarise(newval = any(diff > 5), .groups = "drop") # 输出结果 print(result)
代码解释:
group_by(individual):把数据按个体分组any(diff > 5):检查当前组内是否有任意一个diff值大于5,返回布尔值(TRUE/FALSE).groups = "drop":取消分组状态,得到整洁的输出结果
Python 实现(用pandas库)
用pandas的分组和apply方法同样可以快速实现:
import pandas as pd # 构造输入数据(已有数据框可跳过) data = { "individual": ["A", "A", "A", "A", "B", "B", "B", "B"], "val1": [32, 36, 28, 26, 65, 58, 57, 54], "val2": [36, 28, 26, 26, 64, 59, 54, 51], "diff": [-4, 8, 2, 0, 1, -1, 3, 3] } df = pd.DataFrame(data) # 分组判断并生成结果 result = df.groupby("individual")["diff"].apply(lambda x: any(x > 5)).reset_index(name="newval") # 打印结果 print(result)
代码解释:
groupby("individual")["diff"]:按个体分组后聚焦diff列lambda x: any(x > 5):对每个分组执行判断,只要有一个diff>5就返回Truereset_index(name="newval"):把分组索引转为普通列,并给新列命名为newval
两种方法运行后都会得到你需要的输出:
individual newval
A TRUE
B FALSE
内容的提问来源于stack exchange,提问作者plumb_r
相关产品推荐
相关产品推荐

