使用R的group_by()按条件折叠数据集并生成配对变量
解决方法
假设你的原始数据框名为senate_data,包含congress、RollNo、state、vote(投票结果列)、party(党派列)这些核心字段,以下是用dplyr实现需求的正确代码:
library(dplyr) result_data <- senate_data %>% # 按指定维度分组 group_by(congress, RollNo, state) %>% # 生成两个新变量 mutate( # 同州两位参议员投票是否一致:一致为1,否则0;组内人数不为2时设为NA Pair_Vote = as.integer(ifelse(n() == 2, first(vote) == last(vote), NA)), # 同州两位参议员是否同党派:同党派为1,否则0;组内人数不为2时设为NA Pair_Party = as.integer(ifelse(n() == 2, first(party) == last(party), NA)) ) %>% # 取消分组(可选,根据后续操作需求) ungroup()
代码说明:
group_by(congress, RollNo, state):严格按照你要求的三个维度分组,确保每个组对应某届国会、某次投票、某个州的两位参议员。n() == 2:先检查每个分组是否恰好有2行(对应两位参议员),避免因数据异常(比如某州只有一位参议员参与投票)导致错误结果,这种情况直接标记为NA。first(vote) == last(vote):比较组内第一位和第二位参议员的投票结果,相等则返回TRUE,转成整数后就是1,否则是0。也可以用n_distinct(vote) == 1替代,效果一致。as.integer():把逻辑值(TRUE/FALSE)转换成整数1/0,符合你要的变量格式。
如果你的原始数据中每个分组必然是2行,也可以简化掉ifelse(n() == 2, ...)这部分,直接写:
mutate( Pair_Vote = as.integer(first(vote) == last(vote)), Pair_Party = as.integer(first(party) == last(party)) )
内容的提问来源于stack exchange,提问作者Stephanie Ramsey Davis
相关产品推荐
相关产品推荐

