将dplyr的变量选择功能扩展到自定义功能

时间:2015-12-02 15:32:17

标签: r dplyr

我想知道在我自己的自定义函数中是否有一种简单的方法可以使用dplyr的变量选择函数。通过dplyr的变量选择函数,我的意思是:https://github.com/hadley/dplyr/blob/master/R/select-utils.R

或者,如果你熟悉dplyr,比如“contains”,“one_of”,“starts_with”等等。

我希望能够做的是编写一个仅对某些变量进行操作的函数:

# note: pseudo code
foo = function(df, vars){
  for (var in vars){
     df$var = as.character(df$var)
  }
}

我知道dplyr的“mutate_each”函数,它允许我这样做,但是我必须编写一个对向量进行操作的函数,而不是编写一个对data.frame进行操作的函数。

我的问题的目的是能够更清晰地将自定义函数添加到数据处理管道。例如,我想最终这样做:

df %>%
  foo(starts_with("varname"))

而不是

df %>%
  mutate_each(funs(foo), starts_with("varname"))

我希望这是有道理的。谢谢!

1 个答案:

答案 0 :(得分:2)

你想要

df %>%
  foo(starts_with("varname"))

可以用

解决
df %>% select(starts_with("varname")) %>% foo

如果你真的想要一个单一的功能:

select_and_foo <- function(df,varname) {
    df %>% select(starts_with(varname)) %>% foo %>% return
}

然后

df %>% select_and_foo("varname")

实施例

# create sample data
set.seed(16)
sampledf <- matrix(rnorm(50), ncol = 10) %>% as.data.frame() %>% set_names(paste0(c(rep("H",5),rep("O",5)),1:10))

> sampledf
          H1          H2         H3         H4         H5        O6          O7         O8         O9         O10
1  0.4764134 -0.46841204  1.8471821 -1.6630805 -1.6477976 1.5274670 -0.67252558  0.2805551 -1.3253531  0.28390672
2 -0.1253800 -1.00595059  0.1119334  0.5759095 -0.3141739 1.0541781  0.13259853  0.5447834  2.0651357  0.12157699
3  1.0962162  0.06356268 -0.7460373  0.4727601 -0.1826816 1.0300710 -0.07092735  0.1308698  0.2421730  0.56634411
4 -1.4442290  1.02497260  1.6582137 -0.5427317  1.4704785 0.8401609 -0.94269547  0.2818444 -0.3490972  0.56903290
5  1.1478293  0.57314202  0.7217206  1.1276871 -0.8658988 0.2169647 -1.02203100 -0.2927308 -0.6308124 -0.09058676


# define a function that operates on dataframes and returns a dataframe
foo = . %>% solve %>% t %>% as.data.frame

# et voila
> sampledf %>% select(starts_with("H")) %>% foo
          H1         H2        H3          H4          H5
1  0.3004043 -0.2011219 0.2233852 -0.28712106  0.07735365
2  0.3557121 -0.9996712 0.4830006  0.30975840  0.61582865
3  1.7020360 -0.8657610 0.4686327 -0.35050079  1.61728993
4  0.4993172 -0.2886113 0.4811486 -0.04590702  0.81210612
5 -0.2118682  0.4379735 0.1178755  0.42998574 -0.48759158