[英]Repeatedly mutate variable using dplyr and purrr
我在R中自学成才,这是我的第一个StackOverflow问题。 如果这是一个明显的问题,我道歉; 请善待。
我的问题的简短版本
我编写了一个自定义函数来计算变量年中变化百分比。 我想使用purrr
的map_at
函数将我的自定义函数应用于变量名的向量。 我的自定义函数在应用于单个变量时有效,但在使用map_a
时失败
我的自定义功能
calculate_delta <- function(df, col) {
#generate variable name
newcolname = paste("d", col, sep="")
#get formula for first difference.
calculate_diff <- lazyeval::interp(~(a + lag(a))/a, a = as.name(col))
#pass formula to mutate, name new variable the columname generated above
df %>%
mutate_(.dots = setNames(list(calculate_diff), newcolname)) }
当我将此函数应用于mtcars数据集中的单个变量时,输出与预期一致(尽管显然结果的含义是非敏感的)。
calculate_delta(mtcars, "wt")
尝试使用Purrr将函数应用于字符向量
我认为我无法概念化map_at如何将参数传递给函数。 我可以在网上找到的所有示例片段都使用map_at和is.character
等is.character
,它们不需要额外的参数。 以下是我尝试使用purrr
应用该函数。
vars <- c("wt", "mpg")
mtcars %>% map_at(vars, calculate_delta)
这给了我这个错误信息
粘贴错误(“d”,col,sep =“”):缺少参数“col”,没有默认值
我假设这是因为map_at将vars
作为df
传递,而不传递col
的参数。 为了解决这个问题,我尝试了以下方法:
vars <- c("wt", "mpg")
mtcars %>% map_at(vars, calculate_delta, df = .)
这引发了我这个错误:
Error: unrecognised index type
我和一堆不同的版本一起玩,包括从calculate_delta
函数中删除df
参数,但我没有运气。
其他潜在解决方案
1)使用sapply
而不是purrr
。 我试过这样解决问题并遇到类似麻烦。 我的目标是找出一种方法来使用purrr,如果可能的话。 基于我对purrr
理解,这似乎是一个典型的用例。
2)我显然可以想到如何使用for循环来实现它,但是我试图避免这种情况,如果可能的话。
显然我在考虑这个错误。 请帮忙!
编辑1
为了澄清,我很好奇是否有一种方法可以反复转换完成两件事的变量。
1)在原始tbl_df
生成新变量而不替换替换被变异的列(如使用dplyr
的mutate_at
时的情况)。
2)自动生成新的变量标签。
3)如果可能,通过使用map_at
应用单个函数来完成我所描述的map_at
。
这可能是不可能的,但我觉得应该有一种优雅的方式来完成我所描述的内容。
尝试简化流程:
delta <- function(x) (x + dplyr::lag(x)) /x
cols <- c("wt", "mpg")
#This
library(dplyr)
mtcars %>% mutate_at(cols, delta)
#Or
library(purrr)
mtcars %>% map_at(cols, delta)
#If necessary, in a function
f <- function(df, cols) {
df %>% mutate_at(cols, delta)
}
f(iris, c("Sepal.Width", "Petal.Length"))
f(mtcars, c("wt", "mpg"))
编辑
如果您想在之后嵌入新名称,我们可以编写一个自定义管道就绪函数:
Rename <- function(object, old, new) {
names(object)[names(object) %in% old] <- new
object
}
mtcars %>%
mutate_at(cols, delta) %>%
Rename(cols, paste0("lagged",cols))
如果要重命名结果滞后变量:
mtcars %>% mutate_at(cols, funs(lagged = delta))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.