dplyr:用管道交叉制表

时间:2015-05-07 16:00:32

标签: r dplyr magrittr

关于dplyr有两个问题,在我的案例中,这个问题与我试图解决的问题有关:

  1. 在尝试将一系列操作的结果传递给data_frame时,如何使用管道对xtabs进行交叉分类?
  2. 管道的参数通常用.中的dplyr表示。 magrittr,但这也是用于在公式界面中表示其他所有的标记。我知道某个地方dplyr存在一个未解决的问题(现在无法找到它),该问题涉及将.替换为_
  3. 以下是一个例子:

    wakefield::r_data_frame(
      n = 100,
      cat1 = r_sample_factor(x = LETTERS[1:3]),
      cat2 = r_sample_factor(x = LETTERS[1:3]),
      cat3 = r_sample_factor(x = LETTERS[1:3]),
      bin1 = r_sample_logical()
    ) %>%
      dplyr::filter(bin1) %>%
      xtabs(. ~ cat1 + cat2 + cat3, data = .)
    

    输出失败:

    Error in model.frame.default(formula = . ~ cat1 + cat2 + cat3, data = .) : 
      invalid type (list) for variable '.' 
    

    因为magrittr正在用先前计算的结果.替换第一个data_frame。一种方法是完全省略第一个时期,如下:

    wakefield::r_data_frame(
      n = 100,
      cat1 = r_sample_factor(x = LETTERS[1:3]),
      cat2 = r_sample_factor(x = LETTERS[1:3]),
      cat3 = r_sample_factor(x = LETTERS[1:3]),
      bin1 = r_sample_logical()
    ) %>%
      dplyr::filter(bin1) %>%
      xtabs( ~ cat1 + cat2 + cat3, data = .)
    

    但如果.需要转到formula的另一边怎么办?

    编辑:

    正如@MrFlick指出的那样,xtabs无论如何都不会采用RHS .。我认为这个问题也可以使用我期望使用代码的RHS .冲突来举例说明:

    wakefield::r_data_frame(
      n = 100,
      cat1 = r_sample_factor(x = LETTERS[1:3]),
      cat2 = r_sample_factor(x = LETTERS[1:3]),
      cat3 = r_sample_factor(x = LETTERS[1:3]),
      bin1 = r_sample_logical()
    ) %>%
      dplyr::filter(bin1) %>%
      dplyr::select(-bin1) %>%
      xtabs( ~ ., data = .)
    

    但这确实与预期完全一致。有人可以解释为什么magrittr没有尝试用.替换第一个data_frame吗?

1 个答案:

答案 0 :(得分:1)

customer.get(objectId) 不会替换公式中的句点(“。”)。 vignette(搜索“公式”)中简要描述了这种行为。