r - 如何像 Pandas-Style 一样转换为 R 中的多列?

标签 r pandas dplyr reshape

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

我想要什么:

我正在尝试在 R 中进行简单的分组和总结。

我的首选输出将包含多索引列和多索引行。多索引行使用 dplyr 很容易,难点在于 cols。

我已经尝试过的:

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 withoud 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,但它只打印矩阵中的一个,而不是“计数”的值。

ftable(cp_gb, col.vars=c("CAR_TYPE","JOB"), row.vars = c("SEX","REGION"))

最佳答案

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 中使用了 round 而在 python 中使用了截断 (.astype(int))。

关于r - 如何像 Pandas-Style 一样转换为 R 中的多列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41484386/

相关文章:

python - Pandas 柱有条件回填

r - 每个变量具有多列的分组频率表

r - 使用相同的分组因子多次计算组均值

R 子集/过滤器不返回任何行

r - 如何在R Markdown中的biblatex中更改引用样式?

r - gitlab渲染.rmd而不是wiki中的.md

python - 如何将 pandas DataFrame 保存到 excel 文件?

python - 在 pandas DataFrameGroupBy 对象上使用 `rank`

r - R 的 mlr 包中 makeStackedLearner 的 super.learner

r - 在 R 中使用 mlogit 的级别错误