很多时候,我发现自己在dplyr中手动组合了select()和mutate()函数.这通常是因为我正在整理数据框,想要根据旧列创建新列,并且只想保留新列.
例如,如果我有关于高度和宽度的数据但只想使用它们来计算并保留该区域,那么我将使用:
library(dplyr)
df <- data.frame(height = 1:3, width = 10:12)
df %>%
mutate(area = height * width) %>%
select(area)
Run Code Online (Sandbox Code Playgroud)
当在mutate步骤中创建了许多变量时,可能很难确保它们都在选择步骤中.有没有更优雅的方法来保留mutate步骤中定义的变量?
我一直在使用的一个解决方法如下:
df %>%
mutate(id = row_number()) %>%
group_by(id) %>%
summarise(area = height * width) %>%
ungroup() %>%
select(-id)
Run Code Online (Sandbox Code Playgroud)
这有效,但非常冗长,使用summarize()意味着性能受到影响:
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)
)
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
我想还有另一种解决方法,你可以将原始数据帧名称与新数据帧名称进行比较并采用正确的补充,但也许有更好的方法?
我觉得我在dplyr文档中遗漏了一些非常明显的东西,所以如果这是微不足道的话,请道歉!
只需创建您自己的函数来结合这两个步骤:
\n\nmutate_only = function (.data, ...) {\n names = names(match.call(expand.dots = FALSE)$...)\n .data %>% mutate(...) %>% select(one_of(names))\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这需要一些工作才能通过标准评估正常运行。不幸的是,dplyr API 目前正在这一点上不断发展,所以我不知道几周后 xe2x80x99 的建议是什么。因此我\xe2\x80\x99ll只是参考相关文档。
\n