length()在使用点表示法的聚合函数中不起作用

时间:2013-05-17 20:19:19

标签: r aggregate

我有一个由因子和数字变量组成的大型数据框(数字变量包含NA)。我想找到一个因子变量的不同级别的多个数值变量的观察次数。我没有单独处理每个数字变量,而是尝试使用带有点表示法或cbind的聚合函数来表示我想要分组的数字变量并使用length()计算。但是,当我这样做时,聚合为每个变量提供相同数量的观察,我知道这是错误的。有关聚合和长度的内容对多个变量不起作用吗?

这是一个简单的例子来说明问题... var1在所有组中应该有n = 3,当我自己处理它时它会这样做,但是使用点表示法或cbind它只假设var2的n值

    df <- data.frame(group=c("a","b","c","a","b","c","a","b","c"), var1=1:9, var2=c(1,2,3,NA,5,6,7,8,9))
    aggregate(var1 ~ group, df, length) 
    aggregate(var2 ~ group, df, length) 
    aggregate(. ~ group, df, length)
    aggregate(cbind(var1,var2) ~ group, df, length)

1 个答案:

答案 0 :(得分:3)

也许这会有所帮助:

df <- data.frame(group=c("a","b","c","a","b","c","a","b","c"),
                 var1=1:9, var2=c(1,2,3,NA,5,6,7,8,9))

with(df, length(cbind(var1, var2)))

> with(df, length(cbind(var1, var2)))
[1] 18

length()cbind(var1, var2)视为矩阵,它只是一个带维度的向量,因此您将报告的长度报告为prod(nrow(mat), ncol(mat)),其中mat是生成的矩阵。< / p>

理想情况下,您使用nrow()代替length(),但可能更广泛适用的是NROW()函数,它会将矢量视为1列矩阵,以便进行评估功能。 nrow()不适用于矢量输入

> nrow(1:10)
NULL

E.g。试试这些:

aggregate(cbind(var1,var2) ~ group, df, NROW)
aggregate(var1 ~ group, df, NROW)

> aggregate(cbind(var1,var2) ~ group, df, NROW)
  group var1 var2
1     a    2    2
2     b    3    3
3     c    3    3
> aggregate(var1 ~ group, df, NROW)
  group var1
1     a    3
2     b    3
3     c    3

并且正如您NA一样,您可能不希望删除不完整的案例,默认情况下会发生这种情况。这可以在上面看到,因此为什么组a的行数为2.为此,为调用添加na.action = na.pass

aggregate(cbind(var1,var2) ~ group, df, NROW, na.action = na.pass)

> aggregate(cbind(var1,var2) ~ group, df, NROW, na.action = na.pass)
  group var1 var2
1     a    3    3
2     b    3    3
3     c    3    3

问题在于,在构建要传递给aggregate.data.frame的数据框时,会发生通常的模型框架生成过程,aggregate.formulana.action参数设置为na.omit默认情况下 - 这是使用公式接口的函数建模中的标准行为。

如果您想计算每个变量的非NA值的数量,那么您需要一种完全不同的方法,可能使用is.na(),如

foo <- function(x) sum(!is.na(x))
aggregate(cbind(var1,var2) ~ group, df, foo, na.action = na.pass)

> aggregate(cbind(var1,var2) ~ group, df, foo, na.action = na.pass)
  group var1 var2
1     a    3    2
2     b    3    3
3     c    3    3

通过强制第一NA - &gt;来计算非TRUE值的数量。 FALSE通过!,然后生成的TRUE转换为1FALSE转换为0sum()然后添加{{1}}为了我们。