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

如何将DataFrame观测值转换为变量/列?dcast方法未达预期

解决方法

你的需求是按precinct分组,分别计算各种族的总人数和各年龄段的总人数,并将这些统计结果合并到同一行。之前用dcast的方式会生成race+age的组合列(比如black_18-40),不符合预期。可以通过分别汇总两个维度的数据再合并的方式实现:

方法1:使用dplyr直接汇总

library(dplyr)

# 假设你的数据框名为mydataframe
result_df <- mydataframe %>%
  group_by(precinct) %>%
  summarise(
    black = sum(people[race == "black"]),
    white = sum(people[race == "white"]),
    hispanic = sum(people[race == "hispanic"]),
    asian = sum(people[race == "asian"]),
    `18-40` = sum(people[age == "18-40"]),
    `40 or older` = sum(people[age == "40 or older"])
  )

方法2:用tidyr分维度汇总后合并

如果种族或年龄段的类别较多,手动写条件太麻烦,可以用pivot_wider分别处理两个维度,再合并:

library(tidyr)
library(dplyr)

# 按种族汇总
race_summary <- mydataframe %>%
  pivot_wider(
    id_cols = precinct,
    names_from = race,
    values_from = people,
    values_fn = sum
  )

# 按年龄段汇总
age_summary <- mydataframe %>%
  pivot_wider(
    id_cols = precinct,
    names_from = age,
    values_from = people,
    values_fn = sum
  )

# 合并两个结果
result_df <- inner_join(race_summary, age_summary, by = "precinct")

方法3:使用data.table实现

如果处理大数据量,data.table的效率更高:

library(data.table)
setDT(mydataframe)

# 计算各种族总人数
race_dt <- mydataframe[, .(
  black = sum(people[race == "black"]),
  white = sum(people[race == "white"]),
  hispanic = sum(people[race == "hispanic"]),
  asian = sum(people[race == "asian"])
), by = precinct]

# 计算各年龄段总人数
age_dt <- mydataframe[, .(
  `18-40` = sum(people[age == "18-40"]),
  `40 or older` = sum(people[age == "40 or older"])
), by = precinct]

# 合并数据
result_dt <- race_dt[age_dt, on = "precinct"]

为什么原dcast方法不符合预期

你之前的dcast公式Precinct ~ race + age会将种族和年龄段的组合作为列名(比如black_18-40、white_40 or older),得到的是每个种族在对应年龄段的人数,而不是每个种族的总人数、每个年龄段的总人数,因此无法得到你想要的结果。

内容的提问来源于stack exchange,提问作者Generic_User_ID

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:35:28