2011-06-28 16 views
6

定義:グループで最も頻繁に発生をキャプチャする変数を作成します

df1 <-data.frame(
id=c(rep(1,3),rep(2,3)), 
v1=as.character(c("a","b","b",rep("c",3))) 
) 

S。T.

> df1 
    id v1 
1 1 a 
2 1 b 
3 1 b 
4 2 c 
5 2 c 
6 2 c 

は私がid S。T.によってv1の中で最も頻繁に観察が含まれている3番目の変数freqを作成したいです

> df2 
    id v1 freq 
1 1 a b 
2 1 b b 
3 1 b b 
4 2 c c 
5 2 c c 
6 2 c c 
+1

idグループ内での結びつきはどうですか? – Chase

+0

@Chase私の場合は、結びつきがないと確信しています。 – Fred

+0

結びつきについての良い質問、私は私のソリューションがそれをどのように処理するかをメモします... – joran

答えて

3
あなたが行うことができます

この最頻値を選び出すためにddplyとカスタム関数を使用して:

myFun <- function(x){ 
    tbl <- table(x$v1) 
    x$freq <- rep(names(tbl)[which.max(tbl)],nrow(x)) 
    x 
} 

ddply(df1,.(id),.fun=myFun) 

which.maxはネクタイの場合は、最大値の最初の出現を返すことに注意してください。結び目をランダムに破るオプションについては、nnetパッケージの?? .is.maxを参照してください。

+0

+1ニース........ – Andrie

1
mode <- function(x) names(table(x))[ which.max(table(x)) ] 
df1$freq <- ave(df1$v1, df1$id, FUN=mode) 
> df1 
    id v1 freq 
1 1 a b 
2 1 b b 
3 1 b b 
4 2 c c 
5 2 c c 
6 2 c c 
+0

私は 'df2'がタイプミスだと思います。 'id'のための' NA' = 2です。 – joran

+0

ありがとうございました。固定 –

+0

typoがなくなったが、私はまだこのコードが動作しているとは思わない。 id = 2の場合、max(table(x))は3を返しますが、table(x)は1つの名前しか持たないので、関数モードはNAを返します。 – joran

1

別の方法は、tidyverse機能を使用することからなる:

  • group_by()を使用して、最初のグループ化、およびarrange()
  • と出現の数で配置 tally()
  • を用いて第2変数の発生を数えます
  • summarize()first()
  • で最初の行を要約して取り出す

したがって:

df1 %>% 
group_by(id, v1) %>% 
tally() %>% 
arrange(id, desc(n)) %>% 
summarize(freq = first(v1)) 

これは、あなた(私はクリーナー見つける。)だけのマッピングを提供します:

# A tibble: 2 x 2 
    id freq 
    <dbl> <fctr> 
1  1  b 
2  2  c 

あなたはそのテーブルと、その後left_join元のデータフレームすることができます。

+0

'tally()'の後に結びつきを確認して識別できるので、私はそのアプローチが好きです。それは@ジョランの素晴らしい機能でも可能かもしれないが、私にとっては少なくともここではまっすぐではない。 – Tjebo

関連する問題