在函数内部组合dplyr时出错

时间:2014-09-16 23:35:29

标签: r function dplyr

我正在试图找出我在这里做错了什么。使用以下训练数据,我使用dplyr计算一些频率:

group.count     <- c(101,99,4) 
data   <- data.frame(
    by = rep(3:1,group.count),
    y = rep(letters[1:3],group.count))

data %>%  
group_by(by) %>%
summarise(non.miss = sum(!is.na(y)))

这给了我正在寻找的结果。但是,当我尝试将其作为函数执行时:

res0   <- function(x1,x2) {
output = data %>%  
    group_by(x2) %>%
    summarise(non.miss = sum(!is.na(x1)))
}

res0(y,by)

我收到错误(index out of bounds)。 任何人都可以告诉我我错过了什么吗? 谢谢你提前。

2 个答案:

答案 0 :(得分:0)

你不能像dplyr中那样做。

问题是你现在正在传递一个NULL对象。 by在任何地方都不存在。您的第一个想法可能是通过"by",但这也不适用于dplyrdplyr在这里做的是尝试group_by变量x2,它不是您的data.frame的一部分。要显示此信息,请将data.frame设为:

data   <- data.frame(
  x2 = rep(3:1,group.count),
  x1 = rep(letters[1:3],group.count)
)

然后再次调用你的函数,它将返回预期的输出。

答案 1 :(得分:0)

我建议您将数据框的名称更改为df。

这基本上就是你所做的:

df %>%  
  group_by(by) %>%
  summarise(non.miss = sum(!is.na(y)))

产生这个:

#  by non.miss
#1  1        4
#2  2       99
#3  3      101

但要计算每组的观察次数,可以使用length,它会给出相同的答案:

df %>%  
  group_by(by) %>%
  summarise(non.miss = length(y))


#  by non.miss
#1  1        4
#2  2       99
#3  3      101

或者,使用tally,其中包含:

df %>%  
  group_by(by) %>%
  tally

#  by   n
#1  1   4
#2  2  99
#3  3 101

现在,你可以把它放在一个函数中。输入将是数据帧。像这样:

res0   <- function(df) {
df %>%  
    group_by(by) %>%
    tally 
}

res0(df)

#       by   n
#1       1   4
#2       2  99
#3       3 101

这当然假设您的数据框始终具有名为&#39; by&#39;的分组列。我意识到这些数据只是虚构的,但避免使用“#”;可能是一个好主意,因为这是它自己在R中的功能 - 用它来阅读代码可能会有点混乱。