通常,我发现自己在dplyr中手动组合了select()和mutate()函数。这通常是因为我正在整理数据框,想基于旧列创建新列,而只想保留新列。
例如,如果我有关于高度和宽度的数据,但只想使用它们来计算和保留面积,那么我将使用:
library(dplyr)
df <- data.frame(height = 1:3, width = 10:12)
df %>%
mutate(area = height * width) %>%
select(area)
当在mutate步骤中创建许多变量时,很难确保它们都在select步骤中。有没有更优雅的方法来仅保留在mutate步骤中定义的变量?
我一直在使用的一种解决方法是:
df %>%
mutate(id = row_number()) %>%
group_by(id) %>%
summarise(area = height * width) %>%
ungroup() %>%
select(-id)
这可行,但是非常冗长,并且使用summarise()意味着性能受到了影响:
library(microbenchmark)
microbenchmark(
df %>%
mutate(area = height * width) %>%
select(area),
df %>%
mutate(id = row_number()) %>%
group_by(id) %>%
summarise(area = height * width) %>%
ungroup() %>%
select(-id)
)
输出:
min lq mean median uq max neval cld
868.822 954.053 1258.328 1147.050 1363.251 4369.544 100 a
1897.396 1958.754 2319.545 2247.022 2549.124 4025.050 100 b
我在想还有另一种解决方法,您可以将原始数据框名称与新数据框名称进行比较,并采用正确的补码,但是也许有更好的方法吗?
我觉得我在dplyr文档中确实缺少一些明显的东西,如果这很简单,我们深表歉意!
最佳答案
只需创建将两个步骤结合在一起的自己的函数:
mutate_only = function (.data, ...) {
names = names(match.call(expand.dots = FALSE)$...)
.data %>% mutate(...) %>% select(one_of(names))
}
这需要一些工作才能正常进行标准评估。不幸的是,目前dplyr API正在发展中,因此我不知道几周后对此的建议。因此,我将仅引用relevant documentation。