ここ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
たとえば、変更)。ただし、行列の次元が大きくなると、これは機能しないようです。そして、私は何が悪いのか理解できません!何か案は?