我有一个由因子和数字变量组成的大型数据框(数字变量包含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)
答案 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.formula
将na.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
转换为1
,FALSE
转换为0
,sum()
然后添加{{1}}为了我们。