Trong khi thử nghiệm với aggregate
cho một câu hỏi khác here, tôi đã gặp phải một kết quả khá lạ. Tôi không thể tìm ra lý do tại sao và tôi tự hỏi nếu những gì tôi đang làm là hoàn toàn sai.kết quả không mong muốn từ tổng hợp
Giả sử, tôi có một data.frame
như thế này:
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
Bây giờ, nếu tôi muốn ra một data.frame
với hàng độc đáo với một cột bổ sung cho thấy tần số của họ trong df
. Trong ví dụ này,
# V1 V2 V3 V4 x
# 1 1 2 3 4 3
# 2 2 3 4 5 2
# 3 3 4 5 6 1
tôi đắc đầu ra này bằng aggregate
bằng cách thử nghiệm như sau:
> 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
Vì vậy, điều này đã cho tôi chuỗi dán. Vì vậy, nếu tôi sử dụng length
thay vì print
, nó sẽ cho tôi số lần xuất hiện như vậy, đó là kết quả mong muốn, đó là trường hợp (như được hiển thị bên dưới).
> 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
Và điều này dường như hoạt động. Tuy nhiên, khi kích thước data.frame
là 4 * 2500, đầu ra data.frame
là 1 * 2501 thay vì 4 * 2501 (tất cả các hàng là duy nhất, do đó tần số là 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
Tôi đã thử nghiệm với dữ liệu nhỏ hơn. Khung với chỉ các hàng duy nhất và nó cho đầu ra đúng (thay đổi nrow=40
, ví dụ). Tuy nhiên, khi kích thước của ma trận tăng lên, điều này dường như không hoạt động. Và tôi không thể hiểu được chuyện gì đang xảy ra! Bất kỳ ý tưởng?
Có thể, bởi vì chuỗi quá dài và chèn dòng lệnh 'as.character'? – Roland
vâng, như là một thay thế bạn có thể làm 'tổng hợp (rep (1, nrow (df)), df, FUN = chiều dài)'. – flodel
Điều này không liên quan gì đến 'as.character()' vì mỗi đối số của nó là một chiều dài 1 vectơ. Để thấy rằng phần này hoạt động, chỉ cần làm 'do.call (paste, df [1: 3,])'. –