私が持っているとしましょう:
v = rep(c(1,2, 2, 2), 25)
今、私はそれぞれのユニークな値が現れる回数を数えたいと思います。 unique(v)
はユニークな値が何であるかを返しますが、それらがいくつあるかを返しません。
> unique(v)
[1] 1 2
私にくれるものが欲しい
length(v[v==1])
[1] 25
length(v[v==2])
[1] 75
しかし、より一般的なワンライナーとして:)このような何か(しかしかなりではありません)を閉じます:
#<doesn't work right> length(v[v==unique(v)])
おそらくテーブルはあなたが何をしているのですか?
dummyData = rep(c(1,2, 2, 2), 25)
table(dummyData)
# dummyData
# 1 2
# 25 75
## or another presentation of the same data
as.data.frame(table(dummyData))
# dummyData Freq
# 1 1 25
# 2 2 75
複数の因子(=多次元データフレーム)がある場合は、dplyr
パッケージを使用して、因子の組み合わせごとに固有の値を数えることができます。
library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())
パイプ演算子%>%
を使用して、データフレームdata
のメソッド呼び出しを連鎖します。
aggregate
を使用することによる1行のアプローチです。
> aggregate(data.frame(count = v), list(value = v), length)
value count
1 1 25
2 2 75
Chase が示唆しているように、table()関数が良い方法です。大規模なデータセットを分析している場合は、datatableパッケージで.N関数を使用するという方法もあります。
次の方法でデータテーブルパッケージをインストールしたことを確認してください。
install.packages("data.table")
コード:
# Import the data.table package
library(data.table)
# Generate a data table object, which draws a number 10^7 times
# from 1 to 10 with replacement
DT<-data.table(x=sample(1:10,1E7,TRUE))
# Count Frequency of each factor level
DT[,.N,by=x]
一意の値の数を含む無次元整数ベクトルを取得するには、c()
を使用します。
dummyData = rep(c(1, 2, 2, 2), 25) # Chase's reproducible data
c(table(dummyData)) # get un-dimensioned integer vector
1 2
25 75
str(c(table(dummyData)) ) # confirm structure
Named int [1:2] 25 75
- attr(*, "names")= chr [1:2] "1" "2"
これはユニークな値のカウントを別の関数に入れる必要がある場合に便利かもしれませんし、Chaseの答えに対するコメントに投稿されたt(as.data.frame(table(dummyData))[,2]
よりも短くて慣用的です。こちら を指摘してくれたRicardo Saportaに感謝します 。
これは私のために働きます。あなたのベクトルを取るv
length(summary(as.factor(v),maxsum=50000))
コメント:maxsumをユニークな値の数を捉えるのに十分な大きさに設定してください
またはmagrittr
パッケージと一緒に
v %>% as.factor %>% summary(maxsum=50000) %>% length
値を含むデータフレーム内の追加の列(たとえば、サンプルサイズを表すことがある列)として一意の値の数を保持する必要がある場合、plyrは適切な方法を提供します。
data_frame <- data.frame(v = rep(c(1,2, 2, 2), 25))
library("plyr")
data_frame <- ddply(data_frame, .(v), transform, n = length(v))
tidyverse
も試すことができます
library(tidyverse)
dummyData %>%
as.tibble() %>%
count(value)
# A tibble: 2 x 2
value n
<dbl> <int>
1 1 25
2 2 75
また、値をカテゴリカルにしてsummary()
を呼び出すとうまくいきます。
> v = rep(as.factor(c(1,2, 2, 2)), 25)
> summary(v)
1 2
25 75
Data.frame(例えばtrain.data)上でユニークに実行し、またカウント(分類子の重みとして使用できる)を取得したい場合は、次のようにすることができます。
unique.count = function(train.data, all.numeric=FALSE) {
# first convert each row in the data.frame to a string
train.data.str = apply(train.data, 1, function(x) paste(x, collapse=','))
# use table to index and count the strings
train.data.str.t = table(train.data.str)
# get the unique data string from the row.names
train.data.str.uniq = row.names(train.data.str.t)
weight = as.numeric(train.data.str.t)
# convert the unique data string to data.frame
if (all.numeric) {
train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1,
function(x) as.numeric(unlist(strsplit(x, split=","))))))
} else {
train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1,
function(x) unlist(strsplit(x, split=",")))))
}
names(train.data.uniq) = names(train.data)
list(data=train.data.uniq, weight=weight)
}