如何将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
相关产品推荐
相关产品推荐

