dplyr:带管道的交叉表
dplyr: Cross-tabulation with pipes
有两个关于 dplyr 的问题,就我而言,这两个问题与我要解决的问题有关:
- 在尝试将一系列操作的结果传递给
xtabs
时,如何使用管道对 data_frame
进行交叉分类?
- 管道的参数通常在
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
替换第一个 .
吗?
magrittr
不会替换公式中的句点 (.)。 vignette(搜索 "formula")中简要描述了该行为。
有两个关于 dplyr 的问题,就我而言,这两个问题与我要解决的问题有关:
- 在尝试将一系列操作的结果传递给
xtabs
时,如何使用管道对data_frame
进行交叉分类? - 管道的参数通常在
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
替换第一个 .
吗?
magrittr
不会替换公式中的句点 (.)。 vignette(搜索 "formula")中简要描述了该行为。