hack のためのネタ帳, etc,,,

こんな面倒なことしなくてももっと簡単な方法があった。
続きを参照。

目標

ベクトルに格納されている値が先頭から数えて現在位置での出現回数、及び全体での出現回数を計算をしたい。
Excel で例えると、以下の表で、
B1 に「=countif(A$1:A1,A1)」を入れて B2:B8 にコピー
C1 に「=countif(A$1:A$8,A1)」を入れて C2:C8 にコピー
したような計算をしたい。
ABC
1a15
2b12
3a25
4a35
5a45
6a55
7b22
8c11

ループによる実装

value_count <- function(x) {
  result = temp = c()
  for (i in x) {
    temp = c(temp, i)
    result = c(result, sum(temp == i))
  }
  result
}

value_count_total <- function(x) {
  result = c()
  for (i in x) {
    result = c(result, sum(x == i))
  }
  result
}

行列演算による実装

value_count_matrix <- function(x) {
  apply(matrix(x, length(x), length(x), byrow=T) == x, 1, cumsum)
}

value_count <- function(x) {
  diag(value_count_matrix(x))
}

value_count_total <- function(x) {
  value_count_matrix(x)[length(x),]
}

結果

> x = c("a", "b", "a", "a", "a", "a", "b", "c")
> x
[1] "a" "b" "a" "a" "a" "a" "b" "c"
> y = value_count(x)
> y
[1] 1 1 2 3 4 5 2 1
> z = value_count_total(x)
> z
[1] 5 2 5 5 5 5 2 1
> data.frame(x, y, z)
  x y z
1 a 1 5
2 b 1 2
3 a 2 5
4 a 3 5
5 a 4 5
6 a 5 5
7 b 2 2
8 c 1 1
x の各値に対して、y がこれまでの出現回数、z がトータルの出現回数。

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

編集にはIDが必要です