2013-11-14 8 views
8

私はまだRの方が新しいので、あまりにも基本的に思えば、事前に謝罪しています。次のように因子を含む複数の列にわたって最も頻繁に値を見つける方法

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

私は同じカテゴリを持っているいくつかの要因変数を含むデータセットを持っています。私は、カテゴリー変数を横切る各観測について最も頻繁に発生するカテゴリーを見つける必要があります。結びつきの場合は、任意の値を選択することができますが、私がそれ以上の制御権を持つことができれば幸いです。

私のデータセットには10​​0以上の要素が含まれています。溶液は、各行の最も頻繁なカテゴリーを含ん例えばVAR5、のために、データフレーム内で可変であるべきである

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


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

:ただし、構造は、そのようなものです。

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

どれでもアドバイスは次のようになります。それは、私はこのソリューションを持っていると思います。この場合

(データは数値ベクトルに最初に変換する必要がある場合には)因子または数値のベクターであり得ますとても有難い!前もって感謝します!以下のような

答えて

13

何か:場合

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" 
+0

いい仕事、私よりもクリーナー。私はすべての変換、非公開などをスキップすることができなかったことを認識していませんでした –

+0

このソリューションをありがとうございました。私は自分のデータで試したところ、完璧に動作します!どうか、私のために明確にしてください。どうすればこの方法で結びつきを解決できますか?ありがとう! – ZMacarozzi

+0

ネクタイでケースを説明するために私の答えを編集しました。ヘルプページの使い方を学ぶのは良い習慣です。私のソリューションはあなたのために働いてうれしいです。 – Chargaff

0

あなたのデータはあなたが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の解決策は単純であり、いくつかのケースではうまく動作します。 data.tableを使用すると、わずかなパフォーマンス向上(〜20%)が得られます。

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 
関連する問題