質問
私は数のベクトルを持っています:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
453,435,324,34,456,56,567,65,34,435)
どのように私はR値の回数をカウントし、のX のベクトルで表示されていことができますか?
解決
あなただけのtable()
を使用することができます:
> a <- table(numbers)
> a
numbers
4 5 23 34 43 54 56 65 67 324 435 453 456 567 657
2 1 2 2 1 1 2 1 2 1 3 1 1 1 1
次に、あなたはそれをサブセットすることができます:
> a[names(a)==435]
435
3
それとも、それでの作業がより快適にしている場合はdata.frameに変換します:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
他のヒント
最も直接的な方法はsum(numbers == x)
です。
numbers == x
xが発生毎に場所にTRUEとなる論理ベクターを作成し、sum
ing場合、論理ベクトルが1にTRUEおよびFALSE 0に変換する数値に強制されます。
しかし、浮動小数点数のために、それはのようなものを使用する方が良いということに注意してください:。sum(abs(numbers - x) < 1e-6)
を
私はおそらくこのような何かをするだろう。
length(which(numbers==x))
しかし、実際に、より良い方法がある。
table(numbers)
count(numbers)
パッケージからplyr
もあります。私の意見でtable
よりもはるかに便利ます。
私の好適な解決策は値を返しますrle
、その値が順番に登場する回数を表す(ラベル、あなたの例ではx
)と長さを、使用します。
rle
でsort
を組み合わせることで、あなたはどのような値が出現した回数をカウントする、非常に高速な方法を持っています。これは、より複雑な問題で参考にすることができます。
例:
> numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435)
> a <- rle(sort(numbers))
> a
Run Length Encoding
lengths: int [1:15] 2 1 2 2 1 1 2 1 2 1 ...
values : num [1:15] 4 5 23 34 43 54 56 65 67 324 ...
必要な値が表示されない、またはそれ以降のためにその値を格納する必要がある場合は、a
data.frame
を行います。
> b <- data.frame(number=a$values, n=a$lengths)
> b
values n
1 4 2
2 5 1
3 23 2
4 34 2
5 43 1
6 54 1
7 56 2
8 65 1
9 67 2
10 324 1
11 435 3
12 453 1
13 456 1
14 567 1
15 657 1
私は私が一つの値ではなく、すべての値の頻度を知りたいということは稀である見つけ、RLEカウントし、それらのすべてを保存を取得する最も簡単な方法のようです。
そのためのRで標準機能があります。
tabulate(numbers)
ここ1つの、迅速かつ汚い方法です。
x <- 23
length(subset(numbers, numbers==x))
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435 453,435,324,34,456,56,567,65,34,435)
> length(grep(435, numbers))
[1] 3
> length(which(435 == numbers))
[1] 3
> require(plyr)
> df = count(numbers)
> df[df$x == 435, ]
x freq
11 435 3
> sum(435 == numbers)
[1] 3
> sum(grepl(435, numbers))
[1] 3
> sum(435 == numbers)
[1] 3
> tabulate(numbers)[435]
[1] 3
> table(numbers)['435']
435
3
> length(subset(numbers, numbers=='435'))
[1] 3
あなたが、その後出現回数をカウントしたい場合は、sapply
機能を利用することができます:
index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x]))
cbind(numbers, index)
出力:
numbers index
[1,] 4 1
[2,] 23 1
[3,] 4 2
[4,] 23 2
[5,] 5 1
[6,] 43 1
[7,] 54 1
[8,] 56 1
[9,] 657 1
[10,] 67 1
[11,] 67 2
[12,] 435 1
[13,] 453 1
[14,] 435 2
[15,] 324 1
[16,] 34 1
[17,] 456 1
[18,] 56 2
[19,] 567 1
[20,] 65 1
[21,] 34 2
[22,] 435 3
あなたが行以下に望むものは何でも番号を変更することができます。
length(which(numbers == 4))
テーブルを使用しますがnames
との比較なします:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435)
x <- 67
numbertable <- table(numbers)
numbertable[as.character(x)]
#67
# 2
あなたが別の要素数回のカウントを使用しているとき、 table
に便利です。あなただけの1つのカウントが必要な場合は、使用しsum(numbers == x)
私は便利見つけるもう一つの方法は次のとおりです。
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435)
(s<-summary (as.factor(numbers)))
この因子するデータセットを変換し、要約()私たちのコントロールトータル(一意の値の数)を与えます。
出力されます:
4 5 23 34 43 54 56 65 67 324 435 453 456 567 657
2 1 2 2 1 1 2 1 2 1 3 1 1 1 1
これは、好ましい場合にデータフレームとして格納することができる。
as.data.frame(CBIND(数=名(複数可)のFreq = S)、stringsAsFactors = F、row.names = 1:長さ(S))
ここrow.namesは、行名の名前を変更するために使用されています。 row.namesを使用せずに、複数の列名は、新しいデータフレームの行名として使用されている
出力されます:
Number Freq
1 4 2
2 5 1
3 23 2
4 34 2
5 43 1
6 54 1
7 56 2
8 65 1
9 67 2
10 324 1
11 435 3
12 453 1
13 456 1
14 567 1
15 657 1
タグの特定の要素をカウントするさまざまな方法があります
library(plyr)
numbers =c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,7,65,34,435)
print(length(which(numbers==435)))
#Sum counts number of TRUE's in a vector
print(sum(numbers==435))
print(sum(c(TRUE, FALSE, TRUE)))
#count is present in plyr library
#o/p of count is a DataFrame, freq is 1 of the columns of data frame
print(count(numbers[numbers==435]))
print(count(numbers[numbers==435])[['freq']])
これは明白な意味で、outer
続く等式のメトリックスを取得するためにrowSums
で行うことができます。
同じデータセットの数とnumbers
を持っているために、data.frameが最初に作成されます。あなたが別の入力と出力をしたい場合、この手順は必要ありません。
df <- data.frame(No = numbers)
df$count <- rowSums(outer(df$No, df$No, FUN = `==`))