在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)。
我與只是唯一行較小data.frames測試,它使右輸出(變化nrow=40
,例如)。但是,當矩陣的尺寸增加時,這似乎不起作用。我只是無法弄清楚發生了什麼問題!有任何想法嗎?
也許,因爲字符串變得太長而'as.character'插入換行符? – Roland
是的,作爲一種替代方法,您可以執行'aggregate(rep(1,nrow(df)),df,FUN = length)'。 – flodel
這與'as.character()'無關,因爲它的每個參數都是長度爲1的向量。要看到這部分工作,只需執行'do.call(paste,df [1:3,])'。 –