You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:55:24