我是 R 自学的,这是我的第一个 StackOverflow 问题。如果这是一个明显的问题,我深表歉意;请善待。
我的问题的简短版本
我编写了一个自定义函数来计算变量逐年变化的百分比。我想使用purrr
'smap_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
,不需要额外的参数。这是我尝试使用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
我玩弄了一堆不同的版本,包括df
从函数中删除参数calculate_delta
,但我没有运气。
其他潜在的解决方案
1) 这个版本使用sapply
, 而不是purrr
. 我已经尝试过以这种方式解决问题并且遇到了类似的问题。如果可能的话,我的目标是找出一种使用 purrr 的方法。根据我对 的理解purrr
,这似乎是一个典型的用例。
2)我显然可以想到如何使用 for 循环来实现这一点,但是出于类似的原因,如果可能的话,我会尽量避免这种情况。
显然我在想这个错误。请帮忙!
编辑 1
为了澄清,我很好奇是否有一种重复转换变量的方法可以完成两件事。
1) 在原始变量中生成新变量,tbl_df
而不替换替换正在变异的列(如使用dplyr
's 时的情况mutate_at
)。
2) 自动生成新的变量标签。
3) 如果可能,通过使用map_at
.
这可能是不可能的,但我觉得应该有一种优雅的方式来完成我所描述的。