汇总的意外输出

Aru*_*run 10 aggregate r

这里尝试aggregate另一个问题时,我遇到了一个相当奇怪的结果.我无法弄清楚为什么,我想知道我在做什么是完全错误的.

假设,我有data.frame这样的:

df <- structure(list(V1 = c(1L, 2L, 1L, 2L, 3L, 1L), 
                     V2 = c(2L, 3L, 2L, 3L, 4L, 2L), 
                     V3 = c(3L, 4L, 3L, 4L, 5L, 3L), 
                     V4 = c(4L, 5L, 4L, 5L, 6L, 4L)), 
                  .Names = c("V1", "V2", "V3", "V4"), 
        row.names = c(NA, -6L), class = "data.frame")
> df
#   V1 V2 V3 V4
# 1  1  2  3  4
# 2  2  3  4  5
# 3  1  2  3  4
# 4  2  3  4  5
# 5  3  4  5  6
# 6  1  2  3  4
Run Code Online (Sandbox Code Playgroud)

现在,如果我想输出一个data.frame带有唯一行的唯一行,并指示其频率df.对于这个例子,

#   V1 V2 V3 V4 x
# 1  1  2  3  4 3
# 2  2  3  4  5 2
# 3  3  4  5  6 1
Run Code Online (Sandbox Code Playgroud)

我通过aggregate如下实验获得了这个输出:

> aggregate(do.call(paste, df), by=df, print)

# [1] "1 2 3 4" "1 2 3 4" "1 2 3 4"
# [1] "2 3 4 5" "2 3 4 5"
# [1] "3 4 5 6"
#   V1 V2 V3 V4                         x
# 1  1  2  3  4 1 2 3 4, 1 2 3 4, 1 2 3 4
# 2  2  3  4  5          2 3 4 5, 2 3 4 5
# 3  3  4  5  6                   3 4 5 6
Run Code Online (Sandbox Code Playgroud)

所以,这给了我粘贴的字符串.因此,如果我使用length而不是print,它应该给我这样的事件的数量,这是期望的结果,在这种情况下(如下所示).

> aggregate(do.call(paste, df), by=df, length)
#   V1 V2 V3 V4 x
# 1  1  2  3  4 3
# 2  2  3  4  5 2
# 3  3  4  5  6 1
Run Code Online (Sandbox Code Playgroud)

这似乎有效.但是,当data.frame尺寸为4*2500时,输出data.frame为1*2501而不是4*2501(所有行都是唯一的,因此频率为1).

> df <- as.data.frame(matrix(sample(1:3, 1e4, replace = TRUE), nrow=4))
> o <- aggregate(do.call(paste, df), by=df, length)
> dim(o)
# [1]    1 2501
Run Code Online (Sandbox Code Playgroud)

我使用只有唯一行的较小data.frames进行了测试,并给出了正确的输出(nrow=40例如,更改).但是,当矩阵的尺寸增加时,这似乎不起作用.而我无法弄清楚出了什么问题!有任何想法吗?

Rei*_*son 10

这里的问题是如何aggregate.data.frame()确定群体.

aggregate.data.frame()一个循环中形成分组变量grp.在该循环中,grp通过以下方式更改/更新:

grp <- grp * nlevels(ind) + (as.integer(ind) - 1L)
Run Code Online (Sandbox Code Playgroud)

你的例子的问题,如果一次by被转换为因子,并且循环已经超过所有这些因素,在你的例子中grp最终是:

Browse[2]> grp
[1] Inf Inf Inf Inf
Run Code Online (Sandbox Code Playgroud)

本质上,循环更新将值推grp送到无法区分的数字Inf.

完成aggregate.data.frame()后,这样做

y <- y[match(sort(unique(grp)), grp, 0L), , drop = FALSE]
Run Code Online (Sandbox Code Playgroud)

这就是早期问题现在表现为的地方

dim(y[match(sort(unique(grp)), grp, 0L), , drop = FALSE])
Run Code Online (Sandbox Code Playgroud)

因为

match(sort(unique(grp)), grp, 0L)
Run Code Online (Sandbox Code Playgroud)

显然只返回1:

> match(sort(unique(grp)), grp, 0L)
[1] 1
Run Code Online (Sandbox Code Playgroud)

因为只有一个独特的价值grp.