【发布时间】:2013-01-04 14:05:42
【问题描述】:
在用aggregate 尝试另一个问题here 时,我遇到了一个相当奇怪的结果。我不知道为什么,我想知道我所做的是否完全错误。
假设,我有一个这样的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
现在,如果我想输出带有唯一行的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 获得了这个输出:
> 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
所以,这给了我粘贴的字符串。所以,如果我使用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
这似乎奏效了。但是,当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
我使用只有唯一行的较小 data.frames 进行了测试,它提供了正确的输出(例如更改 nrow=40)。但是,当矩阵的维度增加时,这似乎不起作用。我就是不知道出了什么问题!有什么想法吗?
【问题讨论】:
-
可能是因为字符串太长,
as.character插入了换行符? -
是的,作为替代方案,您可以使用
aggregate(rep(1, nrow(df)), df, FUN = length)。 -
这与
as.character()无关,因为它的每个参数都是长度为 1 的向量。要查看这部分是否有效,只需执行do.call(paste, df[1:3, ])。