2016-10-04 11 views
0

中に2回以上現れる個人のみ取得するにはNAとDF:調査は隔年で行われ、いくつかの個人が繰り返し他人ながら、ちょうど1時間にインタビューをしているし。フィルタ私は回帰を実行するために全国調査を使用していますR

は、今私は(複数回表示されるだけで個人を持っている)DFパネル1にしたいです。 DFは、このようなものです:nquestは家族のコード番号です

year nquest nord nordp sex age 
    2000 10 1  1 F 40 
    2000 10 2  2 M 43 
    2000 30 1  1 M 30 
    2002 10 1  1 F 42 
    2002 10 2  2 M 45 
    2002 10 3  NA F 15 
    2002 30 1  1 M 32 
    2004 10 1  1 F 44 
    2004 10 2  2 M 47 
    2004 10 3  3 F 17 
    2004 50 1  NA M 66 

、ノール個人やnordpのコード番号は、個人が前回調査に持っていたことをコード番号です。新しい個人がインタビューされたとき、nordpの値は "missing"(Rは自動的にNAを挿入する)です。たとえば、家族10の個人3は、彼女がインタビューされたのは初めてであるため、2002年にはnordp = NAを、2004年には3であった(3は2002年の数字であったため)。

家族の構成が変わる可能性があるため、dfをフィルタリングするためにnordを使用することはできません(たとえば、2002年の家族xでは母親がnordp = 2(2000年にはnord = 2でした)とnord = 2翌年のnordは1(例えば、離婚した場合)でもnordpはまだ2)でもかまいません。

私は、このコマンドを使用してフィルタリングすることを試みた:

df <- df %>% 
group_by(nquest, nordp) 
filter(n()>1) 

が、同じ家族のために複数の個別のインサート(NA)がある場合、彼らはとさせていただきますので、私は右のDFを得ることはありませんnordp以来同じ人は初めてNAです。

はどのようにしても、特定の年(nordp = NA)に初めて現れる個々考えることができますか?私は年齢を使ってコマンドを作成しようとしました(年齢は(年齢(t-2)+2)と等しくなります;例えば、2000年齢は20歳、2002年は22歳ですが、それはうまくいかなかった)

DFは千回の観測によって構成されており、私は手動で確認することができないことを考えてみましょう

最終dfは次のようになります。。

year nquest nordp sex age 
    2000 10  1  F 40 
    2000 10  2  M 43 
    2000 30  1  M 30 
    2002 10  1  F 42 
    2002 10  2  M 45 
    2002 10  3  F 15 
    2002 30  1  M 32 
    2004 10  1  F 44 
    2004 10  2  M 47 
    2004 10  3  F 17 

あなたがより多く表示されるだけで、個々がある見ることができるように1回とnquest=10 nordp=30は3回出現する;私の命令では、最初の年にnordpNA

+0

は、あなたが期待される出力を表示することができますが、ベースの私たちは、出力を各サブセットにassignIDを適用し、nquestによってデータフレームを分割し、rbind例の上に – akrun

+0

'nquest、nord' *の与えられた組み合わせが人を特定しないと言っていますか?そのような場合は、データを保存する方法を変更する必要があります。家族のためのIDと、家族に依存しない個性のIDを持つ方がはるかに優れているので、あなたはidからだけでなく、combo family-personからその人を識別することができます。 – nicola

+0

@akrun私はそこにdfを挿入することができなかったので答えに書いた –

答えて

0

私たちは、ユニークなIDの数によってフィルタリング、その後、個人に固有のIDを割り当てます。主な考え方は、数年かけて各家庭内のnordpnord値を連鎖することです。ここには、Identify groups of linked episodes which chain togetherに触発されたアイデアがあります。まず、igraphパッケージを​​経由で読み込みます。次に、次の関数は、指定されたファミリのIDを割り当てます。

assignID <- function(d) { 
    fields <- names(d) # store original column names 
    d$nordp[is.na(d$nordp)] <- seq_len(sum(is.na(d$nordp))) + 100 
    d$nordp_x <- (d$year-2) * 1000 + d$nordp 
    d$nord_x <- d$year * 1000 + d$nord 
    dd <- d[, c("nordp_x", "nord_x")] 
    gr.test <- graph.data.frame(dd) 
    links <- data.frame(org_id = unique(unlist(dd)), 
         id = clusters(gr.test)$membership) 
    d <- merge(d, links, by.x = "nord_x", by.y = "org_id", all.x = TRUE) 
    d$uid <- d$nquest * 100 + d$id 
    d[, c(fields, "uid")] 
} 

機能は

year nordp nord 
2000  1  1 
2002  1  2 
2004  2  3 

が長年にわたってnordpnordを一緒に連鎖することで、同じ個体で、すべての3に同じ一意のIDが割り当てられていること、例えば、「伝える」ことができます行。したがって、たとえば、

assignID(subset(df, nquest == 10)) 
# year nquest nord nordp sex age dob uid 
# 1 2000  10 1  1 F 40 1960 1001 
# 2 2000  10 2  2 M 43 1957 1002 
# 3 2002  10 1  1 F 42 1960 1001 
# 4 2002  10 2  2 M 45 1957 1002 
# 5 2002  10 3 101 F 15 1987 1003 
# 6 2004  10 1  1 F 44 1960 1001 
# 7 2004  10 2  2 M 47 1957 1002 
# 8 2004  10 3  3 F 17 1987 1003 

は私たちに、個々のためのuidと追加の列を与えます。

残りの手順は簡単です。その後

dd <- do.call(rbind, by(df, df$nquest, assignID)) 

我々は、カウントでわずかuidでグループおよびフィルタすることができます:

dd %>% group_by(uid) %>% filter(n()>1) 
# Source: local data frame [10 x 8] 
# Groups: uid [4] 

#  year nquest nord nordp sex age dob uid 
# <int> <int> <int> <dbl> <fctr> <int> <int> <dbl> 
# 1 2000  10  1  1  F 40 1960 1001 
# 2 2000  10  2  2  M 43 1957 1002 
# 3 2002  10  1  1  F 42 1960 1001 
# 4 2002  10  2  2  M 45 1957 1002 
# 5 2002  10  3 101  F 15 1987 1003 
# 6 2004  10  1  1  F 44 1960 1001 
# 7 2004  10  2  2  M 47 1957 1002 
# 8 2004  10  3  3  F 17 1987 1003 
# 9 2000  30  1  1  M 30 1970 3001 
# 10 2002  30  1  1  M 32 1970 3001 
+0

ありがとうございます!私は誕生日を使って別の方法でフィルタリングしようとしましたが、解決策は最高のものです。ありがとうございました! –