4

关于 dplyr 有两个问题,就我而言,这与我要解决的问题有关:

  1. data_frame在尝试将一系列操作的结果传递给时,如何对使用管道进行交叉分类xtabs
  2. 管道的参数通常由.in dplyr&表示magrittr,但这也是用于表示公式接口中其他所有内容的标记。我知道dplyr某处有一个未解决的问题(现在找不到它),它谈论替换._.

这是一个例子:

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

4

1 回答 1

1

magrittr不替换公式中的句点 (".")。小插图中简要描述了该行为(搜索“公式”)。

于 2015-05-07T18:01:50.417 回答