19

私の問題は次のとおりです。

同じカテゴリを持ついくつかの因子変数を含むデータセットがあります。各行で最も頻繁に発生するカテゴリを見つける必要があります。同点の場合は、任意の値を選択できますが、もっと制御できるようになれば素晴らしいと思います。

私のデータセットには、100 を超える因子が含まれています。ただし、構造は次のようなものです。

df = data.frame(id = 1:3
                var1 = c("red","yellow","green")
                var2 = c("red","yellow","green")
                var3 = c("yellow","orange","green")
                var4 = c("orange","green","yellow"))

df
#   id   var1   var2   var3   var4
# 1  1    red    red yellow orange
# 2  2 yellow yellow orange  green
# 3  3  green  green  green yellow

ソリューションは、各行の最も頻度の高いカテゴリを含む var5 など、データ フレーム内の変数である必要があります。因子または数値ベクトルにすることができます (データを最初に数値ベクトルに変換する必要がある場合)

この場合、次の解決策が必要です。

df$var5
# [1] "red"    "yellow" "green" 

どんなアドバイスでも大歓迎です!前もって感謝します!

4

4 に答える 4

24

何かのようなもの :

apply(df,1,function(x) names(which.max(table(x))))
[1] "red"    "yellow" "green" 

同点の場合、 which.max は最初の最大値を取ります。which.max ヘルプ ページから:

位置、つまり、数値ベクトルの (最初の) 最小値または最大値のインデックスを決定します。

元 :

var4 <- c("yellow","green","yellow")
df <- data.frame(cbind(id, var1, var2, var3, var4))

> df
  id   var1   var2   var3   var4
1  1    red    red yellow yellow
2  2 yellow yellow orange  green
3  3  green  green  green yellow

apply(df,1,function(x) names(which.max(table(x))))
[1] "red"    "yellow" "green" 
于 2013-11-14T16:34:24.903 に答える
3

データが非常に大きい場合は、data.tableパッケージの使用を検討することをお勧めします。

# Generate the data
nrow <- 10^5
id <- 1:nrow
colors <- c("red","yellow","green")
var1 <- sample(colors, nrow, replace = TRUE)
var2 <- sample(colors, nrow, replace = TRUE)
var3 <- sample(colors, nrow, replace = TRUE)
var4 <- sample(colors, nrow, replace = TRUE)

Mode <- function(x) {
    ux <- unique(x)
    ux[which.max(tabulate(match(x, ux)))]
}

Chargaff のソリューションは単純で、場合によってはうまく機能します。を使用すると、わずかなパフォーマンスの向上 (~20%) を得ることができますdata.table

df <- data.frame(cbind(id, var1, var2, var3, var4))
system.time(apply(df, 1, Mode))
#   user  system elapsed
#  1.242   0.018   1.264

library(data.table)
dt <- data.table(cbind(id, var1, var2, var3, var4))
system.time(melt(dt, measure = patterns('var'))[, Mode(value1), by = id])
#   user  system elapsed
#  1.020   0.012   1.034
于 2016-02-18T14:11:19.927 に答える