将附加的数据框传递给函数

时间:2019-05-26 16:58:10

标签: r dplyr environment

我正在研究一个函数,该函数将有关特定变量的信息与有关其来自数据帧的一些基本信息结合在一起。这是我正在谈论的示例:

fcn <- function(var,data) {
  return(ncol(data)*mean(var))
}

df <- data.frame(a=1:10,b=1:10)

df %>% dplyr::mutate(c=fcn(a,df))

这很好!但是,如果在函数与with一起使用或在dplyr动词中使用该函数的情况下,我可以只获取数据帧/小对象而不显式传递它,那真的很整洁。所以理想上是这样的

fcn <- function(var,data=attached_data_object) {
  return(ncol(data)*mean(var))
}

df <- data.frame(a=1:10,b=1:10)

df %>% dplyr::mutate(c=fcn(a))

我一直在阅读各种环境功能-似乎我应该能够进入with / dplyr从数据帧创建的环境中,并将所有内容全部批发出来。到目前为止,我还无法弄清楚如何做到这一点。任何提示表示赞赏!谢谢。

2 个答案:

答案 0 :(得分:1)

(对哈德利表示歉意,如果我误解为错误的话)。您可能会发现Advanced R中有关环境和NSE(非标准评估)的章节很有用。

在dplyr动词(例如mutate)中,被操纵的数据帧/小标题称为“。”。因此是“。”在这里的另一个答案是指数据框。 dplyr动词自动出现在“。”中。指定的列名称。当您在mutate()中调用函数时,就像在这里所做的那样,您希望访问名为“”的对象。驻留在函数的执行环境中。那么我们该怎么做呢?

fcn <- function(var) {
  dat <- get(".", env=parent.frame())
  return(ncol(dat) * mean(var))
}

notacol <- 8
df <- data.frame(a=1:10, b=seq(10, 100, 10))
df
    a   b
1   1  10
2   2  20
3   3  30
4   4  40
5   5  50
6   6  60
7   7  70
8   8  80
9   9  90
10 10 100


df %>% mutate(c = fcn(a), d = fcn(b), e = fcn(notacol))
    a   b  c   d  e
1   1  10 11 110 16
2   2  20 11 110 16
3   3  30 11 110 16
4   4  40 11 110 16
5   5  50 11 110 16
6   6  60 11 110 16
7   7  70 11 110 16
8   8  80 11 110 16
9   9  90 11 110 16
10 10 100 11 110 16

我认为这是您的行为。请注意,notacol在执行环境中找不到,因为它不在数据框中,但是Global Env在搜索路径上,因此可以在其中找到。

答案 1 :(得分:0)

我不确定您想要的是什么。
无论如何,您必须将数据集作为第一个函数参数。

library(dplyr)

fcn <- function(data, var) {
  var <- deparse(substitute(var))
  ncol(data)*mean(data[[var]])
}

df <- data.frame(a = 1:10, b = 11:20)

df %>% fcn(a)
#[1] 11

df %>% mutate(c = fcn(., a))
#    a  b  c
#1   1 11 11
#2   2 12 11
#3   3 13 11
#4   4 14 11
#5   5 15 11
#6   6 16 11
#7   7 17 11
#8   8 18 11
#9   9 19 11
#10 10 20 11

df %>% summarise(c = fcn(., a))
#   c
#1 11