我正在试图找出我在这里做错了什么。使用以下训练数据,我使用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
)。
任何人都可以告诉我我错过了什么吗?
谢谢你提前。
答案 0 :(得分:0)
你不能像dplyr
中那样做。
问题是你现在正在传递一个NULL
对象。 by
在任何地方都不存在。您的第一个想法可能是通过"by"
,但这也不适用于dplyr
。 dplyr
在这里做的是尝试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中的功能 - 用它来阅读代码可能会有点混乱。