如何像Randas-Style一样投射到R中的多列?

时间:2017-01-05 11:50:53

标签: r pandas dplyr reshape

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

我想要的:

我试图在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")

现在存在列索引被&#34;融化的问题&#34;一个而不是多索引列,就像我从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,但它只打印矩阵中的那些而不是&#34;计数&#34;的值。

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

1 个答案:

答案 0 :(得分: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的差异,因为在python中使用R中的round和截断(.astype(int))。