2016-04-25 15 views
0

私はその列の中に人(pid)と場所の列であるデータフレームを持っています。人物IDが67回以上発生したときに、人のインスタンスが存在する場所に基づいてデータのサブセットを取得し、そのサブセットで一連の回帰を実行するようにデータをサブセット化しようとしています。問題サブセット化rデータフレーム

私は(テーブル()を使って各PIDのカウントを得るために)そのしきい値に達するすべての人を取得する方法を知っていますが、その場所に基づいてデータフレームのサブセットを取得するにはどうすればいいですか?ありますか?データフレームはおよそ100,000行あり、400人がその67のマークに当たるので、手作業で行うのは実用的ではないようです。

私のデータのサンプルデータセットをここに置く方法はわかりませんが、このように見えます。たとえば、pid値1が200回繰り返された場合、pidに関係なく、ロケーション値が '6'のデータフレームをすべてサブセット化したいと思います。 pid 3に似ています - 場所が「1」のすべての行が必要です。唯一のキャッチは、時にはPIDが複数の場所を持つことがあるということです。大部分はある特定の場所にあります。したがって、pid 3の場合は、場所1と場所2があります。その場合、大多数の場所をサブセット化したいと考えています。

pid  location 
1  6 
1  6 
1  6 
2  4 
2  6 
3  1 
3  2 
3  1 

サンプルデータ

set.seed(1) 
pid <- sample(1:10, 1000, replace=T) 
location <- sample(1:10, replace=T) 
df <- data.frame(pid, location) 

編集: [OK]を - 私は何をしようとしていること以上の66倍を繰り返し、すべてのPIDが取得することです。そのリストを取得したら、その場所がどのような場所にあるのかを確認したいと思います。次に、データフレーム全体の場所のサブセットに対して一連の回帰分析を実行したいと思います。したがって、Pid 1が500回発生し、それらが位置6で発生した場合、位置6のデータフレームをサブセット化し、Pid 1のためのダミー変数を作成し、位置6のそのサブセットで回帰の束を実行する(他の回帰変数は含まれないこのサンプルでは)。データフレームには1272個のユニークなPidがあります。私はAnoからの答えを私が探していたものを得るために使用することができましたが、私は少し違ってそれをやりました。最初に場所によってデータをサブセット化し、次に66回以上繰り返すPidを取得して回帰を実行することは、(少なくとも概念的には)より簡単に思えました。これにより、複数の場所を持つPidの心配がなくなりました。しかし、かなり新しくなったので、私はそれをコード化するより良い方法が何であるかについての他の提案には開いています。 これで少し明確になることを願っています。

+1

希望の出力がどのように表示されるかを明確にする必要があります。 – Frank

+0

wait - 私はstackoverflowを初めて使ったことが分かりましたが、回答がすでに受け入れられた後に投稿が保留になるのはなぜですか?うまくいけばもっと分かりやすいように投稿を編集しよう。 – MikeD

+2

5件の回答がありましたが、そのうちの3件は著者が削除したものです。受け入れられた答えがあなたの意図を正しく推測したという事実は、その点に関する質問を改善するものではありません。さらなる壁の壁を追加した今、再開される価値はあるかもしれませんが、私はその点を見ません。私はあなたが質問をする次回のときにはっきりとしていると言いたいと思います。 – Frank

答えて

1

このソリューションでは、dplyrが使用されます。

library(dplyr) 

グループPIDによるデータ、興味があるものは何でもしきい値に達しているものを除外し、そのPIDであるどのように多くのインスタンス数えた後、選択の異なるPIDを選択

foo <- df %>% 
    group_by(pid) %>% 
    filter(n() >= 67 & max(n() == n())) %>% 
    distinct(pid) %>% 
    .$pid 

使用することを元のデータフレームのサブセットをここでユニークなlocation

unique(df[df$pid %in% foo,"location"]) 
+0

2番目の部分では、pidごとに1つの場所しか必要としません。 – Frank

+1

それを得ました。 – ano

+1

突然変異の必要はなく、最後に2行を '。$ pid'で置き換えることができます。フィルターを追加してください(count == max(count))。 – zx8754

0

を選択するために新しく生成されたベクトルは、を使用せずに可能性があります210:

df.freq <- addmargins(table(df), margin = 2) 
df.freq <- subset(df.freq, 'Sum' > 67, select = -Sum) 

df.max <- apply(df.freq, 1, function(x) { 
    names(x)[which(x == max(x))] }) 
df.max <- unique(as.numeric(df.max)) 
subset(df, location %in% df.max)