来自聚合的意外输出

前端之家收集整理的这篇文章主要介绍了来自聚合的意外输出前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在尝试了另一个问题 here的聚合时,我遇到了一个相当奇怪的结果.我无法弄清楚为什么,我想知道我在做什么是完全错误的.

假设我有一个这样的数据框架:

df <- structure(list(V1 = c(1L,2L,1L,3L,1L),V2 = c(2L,4L,2L),V3 = c(3L,5L,3L),V4 = c(4L,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

现在,如果我想输出一个具有唯一行的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

我通过实验获得了这个输出,如下所示:

> 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

所以,这给了我粘贴的字符串.所以,如果我使用长度而不是打印,它应该给我这样的事件的数量,这是所需的结果,是这种情况(如下所示).

> aggregate(do.call(paste,length)
#   V1 V2 V3 V4 x
# 1  1  2  3  4 3
# 2  2  3  4  5 2
# 3  3  4  5  6 1

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

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

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

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

在aggregate.data.frame()中有一个形成分组变量grp的循环.在该循环中,grp被更改/更新:

grp <- grp * nlevels(ind) + (as.integer(ind) - 1L)

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

Browse[2]> grp
[1] Inf Inf Inf Inf

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

做到这一点,aggregate.data.frame()稍后会这样做

y <- y[match(sort(unique(grp)),grp,0L),drop = FALSE]

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

dim(y[match(sort(unique(grp)),drop = FALSE])

因为

match(sort(unique(grp)),0L)

明显返回只有1:

> match(sort(unique(grp)),0L)
[1] 1

因为只有一个唯一的grp值.

原文链接:https://www.f2er.com/javaschema/281455.html

猜你在找的设计模式相关文章