如何group_by xtab的暗名和基于表中的值进行突变?

时间:2018-07-13 18:20:27

标签: r dplyr magrittr

假设我有一个xtab(作为dplyr管道的最后一步构建),如下所示:

<li>

您可以使用...构建它

foreach

我想要做的是继续执行此管道,但是我不知道如何引用组名或其值。例如,这不起作用:

        treatPer
treatGrp          0          1
       0        7.2        8.4
       1        6.3        9.1

即使这样做,我也不知道如何引用表中的值来.R > dput(x) structure(c(7.2, 6.3, 8.4, 9.1), .Dim = c(2L, 2L), .Dimnames = structure(list(treatGrp = c("0", "1"), treatPer = c("0", "1")), .Names = c("treatGrp", "treatPer")), class = c("xtabs", "table"), call = xtabs(formula = x/1000 ~ treatGrp + treatPer, data = .)) 这样的新列,例如... %>% xtabs(x/1000 ~ treatGrp + treatPer, data = .) %>% group_by(attr(x, 'dimnames')$treatGrp) Error in UseMethod("group_by_") : no applicable method for 'group_by_' applied to an object of class "c('xtabs', 'table')" (即mutate

有什么建议吗?

(我想我可以percentagePointChange然后执行计算并重新应用mutate(ppCh = (value - lag(value))/lag(value)),但是由于我已经提出了这个建议,所以我会根据上述内容查看是否有人使用了recco ... )

1 个答案:

答案 0 :(得分:0)

由于group_by在数据帧上起作用,并且有一个表,因此会出现错误。您需要做的就是使用您选择的group_byas.data.frameas_data_frame或其他可能的方法,将表强制为as_tibble可以使用的东西。所有这些都将在管道中工作,因此您可以执行任何计算,创建xtab,将其管道传输到as_data_frame,然后继续工作。

就像我在前面的评论中说的那样,我无法读取包含公式的数据,因为它指向管道中位于其上方的数据框。

library(tidyverse)

xtab <- structure(c(7.2, 6.3, 8.4, 9.1), .Dim = c(2L, 2L), .Dimnames = 
                    structure(list(treatGrp = c("0", "1"), treatPer = c("0", "1")), 
                    .Names = c("treatGrp", "treatPer")), class = c("xtabs", "table"))

通过as_data_frame进行转换可以得到以下信息:

as_data_frame(xtab)
#> # A tibble: 4 x 3
#>   treatGrp treatPer     n
#>   <chr>    <chr>    <dbl>
#> 1 0        0          7.2
#> 2 1        0          6.3
#> 3 0        1          8.4
#> 4 1        1          9.1

然后,您可以使用group_by及其它方法对它进行常规操作。这是一个示例:

as_data_frame(xtab) %>%
  group_by(treatGrp) %>%
  summarise(avg_n = mean(n))
#> # A tibble: 2 x 2
#>   treatGrp avg_n
#>   <chr>    <dbl>
#> 1 0          7.8
#> 2 1          7.7

或者根据xtabs文档中的示例构建整个管道:

library(tidyverse)

as_data_frame(UCBAdmissions) %>%
  xtabs(n ~ Gender + Admit, data = .) %>%
  as_data_frame() %>%
  group_by(Gender) %>%
  mutate(rate = n / sum(n))
#> # A tibble: 4 x 4
#> # Groups:   Gender [2]
#>   Gender Admit        n  rate
#>   <chr>  <chr>    <dbl> <dbl>
#> 1 Female Admitted   557 0.304
#> 2 Male   Admitted  1198 0.445
#> 3 Female Rejected  1278 0.696
#> 4 Male   Rejected  1493 0.555