2016-05-30 4 views
0

Rのデータフレームは40行と16列のすべての要素から成ります。私は行ごとに最も反復的な要素(因子)を含む17番目の列を作成したいと思います。私はここでstackexchangeで説明されたメソッドを比較しましたが、私が知る限り、これらのメソッドのどれも私の質問に答えていません。私はこのようになりますfouthコラムたいRのデータフレームから各行から最も多く出現する要素を選択する方法

CAT1 CAT2 CAT3 ... 
1 A  B  B 
2 B  B  A 
3 A  A  A 
4 C  C  A 
5 B  C  C 
... 

:私はこれを持って、たとえば言う

COLUMN 
1 B 
2 B 
3 A 
4 C 
5 C 

をそれは難しいことではありませんが、私はそれを見ていませんよ。

答えて

3

あなたはtableを使用することができます。

DF <- read.table(text = " CAT1 CAT2 CAT3 
       1 A  B  B 
       2 B  B  A 
       3 A  A  A 
       4 C  C  A 
       5 B  C  C", header = TRUE) 

find_most_frequent <- function(x) names(which.max(table(x))) 
DF$COLUMN <- apply(DF, 1, find_most_frequent) 
# CAT1 CAT2 CAT3 COLUMN 
#1 A B B  B 
#2 B B A  B 
#3 A A A  A 
#4 C C A  C 
#5 B C C  C 

絆の場合、これは、ソート後に最初に来るの値を返します。文字の並べ替えに関する重要な詳細については、help("Comparison")をお読みください。タイ、その後最初の(BオーバーA、Cを超えるB)が存在する場合

df$mostCommon <- apply(df, 1, function(i) { 
    i <- as.factor(i) 
    levels(i)[which.max(tabulate(i))]}) 

データ

df <- read.table(header=T, text="CAT1 CAT2 CAT3 
A  B  B 
B  B  A 
A  A  A 
C  C  A 
B  C  C") 

う:ここ

+0

ありがとう!方法は分かりませんが、動作します! – Brooky

+0

単に文を解読し、それがどのように動作するかを調べるだけです: 'table(unlist(DF [1、])); which.max(table(unlist(DF [1、]))) ' – Roland

0

tabulate関数を用いる方法であります選択される。

1

tableを使用してもう一つのアイデア、迅速な返信用

df$new <- apply(df, 1, function(i)names(sort(-table(i)))[1]) 
df 
# CAT1 CAT2 CAT3 new 
#1 A B B B 
#2 B B A B 
#3 A A A A 
#4 C C A C 
#5 B C C C 
+0

部分ソートで十分です。 – Roland

+0

私はそれを知らない。私はそれを見てみましょう。ありがとう – Sotos

関連する問題