关于 dplyr 有两个问题,就我而言,这与我试图解决的问题有关:
data_frame
进行交叉分类使用管道,当尝试将一系列操作的结果传递给 xtabs
时? .
表示在 dplyr
& magrittr
,但这也是用于表示公式界面中其他所有内容的标记。我知道 dplyr
上有一个 Unresolved 问题某处(现在无法找到它)谈论更换 .
与 _
. 下面是一个例子:
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 中简要描述了该行为。 (搜索“公式”)。
关于r - dplyr:带管道的交叉表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30106206/