如何在 R 中像 Pandas 风格一样转换为多列?

问题描述 投票:0回答:1

我搜索了很多,但没有找到任何相关内容。

我想要的:我正在尝试用 R 进行简单的分组和总结。

我的首选输出是多索引列和多索引行。使用 dplyr 处理多索引行很容易,难的是列。

我已经尝试过的:

library(dplyr)
cp <- read.table(text="SEX REGION CAR_TYPE JOB EXPOSURE NUMBER
  1   1      1        1   1       70      1
  2   1      1        1   2      154      8
  3   1      1        2   1      210     10
  4   1      1        2   2      21       1
  5   1      2        1   1       77      8
  6   1      2        1   2       90      6
  7   1      2        2   1      105      5
  8   1      2        2   2      140     11
  ")
attach(cp)

cp_gb <- cp %>%
  group_by(SEX, REGION, CAR_TYPE, JOB) %>% 
  summarise(counts=round(sum(NUMBER/EXPOSURE*1000)))

dcast(cp_gb, formula = SEX + REGION ~  CAR_TYPE + JOB, value.var="counts")

现在存在的问题是列索引被“融合”为一个而不是多索引列,就像我从 Python/Pandas 中知道的那样。

输出错误

 SEX REGION 1_1 1_2 2_1 2_2
1      1  14  52  48  48
1      2 104  67  48  79

它在 Pandas 中的工作原理示例:

# clipboard, copy this without the comments: 
# SEX REGION CAR_TYPE JOB EXPOSURE NUMBER
# 1   1      1        1   1       70      1
# 2   1      1        1   2      154      8
# 3   1      1        2   1      210     10
# 4   1      1        2   2      21       1
# 5   1      2        1   1       77      8
# 6   1      2        1   2       90      6
# 7   1      2        2   1      105      5
# 8   1      2        2   2      140     11

df = pd.read_clipboard(delim_whitespace=True)

gb = df.groupby(["SEX","REGION", "CAR_TYPE", "JOB"]).sum()
gb['promille_value'] = (gb['NUMBER'] / gb['EXPOSURE'] * 1000).astype(int)
gb = gb[['promille_value']].unstack(level=[2,3])

正确输出

CAR_TYPE        1   1   2   2
JOB             1   2   1   2
SEX REGION              
1   1           14  51  47  47
1   2           103 66  47  78

更新:什么有效(几乎):

我尝试使用ftable,但它只打印矩阵中的值,而不是“counts”的值。

ftable(cp_gb, col.vars=c("CAR_TYPE","JOB"), row.vars = c("SEX","REGION"))
r pandas dplyr reshape
1个回答
1
投票

ftable 接受因素列表(数据框)或表格对象。不要按原样传递分组数据帧,而是先将其转换为表对象,然后再传递给 ftable 应该可以得到计数:

# because xtabs expects factors
cp_gb <- cp_gb %>% ungroup %>% mutate_at(1:4, as.factor)
xtabs(counts ~ ., cp_gb) %>%
  ftable(col.vars=c("CAR_TYPE","JOB"), row.vars = c("SEX","REGION")) 


#            CAR_TYPE   1       2
#            JOB        1   2   1   2
# SEX REGION
# 1   1                14  52  48  48
#     2               104  67  48  79

R 和 pandas 输出之间的某些计数存在 1 的差异,因为您在 R 中使用舍入,在 Python 中使用截断 (.astype(int))。

© www.soinside.com 2019 - 2024. All rights reserved.