10

ここ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

ここで、の頻度を示す追加の列を含む一意の行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は4*2501ではなく1*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たとえば、変更)。ただし、行列の次元が大きくなると、これは機能しないようです。そして、私は何が悪いのか理解できません!何か案は?

4

1 に答える 1

10

ここでの問題はaggregate.data.frame()、グループをどのように決定するかです。

aggregate.data.frame()グループ化変数を形成するループがありgrpます。そのループでgrpは、次の方法で変更/更新されます。

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

それが一度by因子に変換され、ループがこれらすべて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)), grp, 0L), , drop = FALSE])

なぜなら

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

明らかに次のように返します1:

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

の一意の値は 1 つしかないためですgrp

于 2013-01-21T14:20:47.080 に答える