2017-10-16 12 views
3

私は4年間にわたり2人の個人を繰り返し観察しています。 1年間の観測結果をすべてランダムに選択するにはどうすればよいですか?グループ化されたデータからランダムな観測グループ(行)を選択してください

set.seed(123) 
    dat <- data.frame(IndID = rep(c("AAA", "BBB"), each = 100), 
         Year = sample(c("2001", "2002", "2003", "2005"),200, replace = T), 
         Value = rnorm(200)) 
dat$Value[dat$IndID == "AAA" & dat$Year == "2002"] <- NA 
dat$Value[dat$IndID == "BBB" & dat$Year == "2005"] <- NA 

個々の年の組み合わせのサンプルサイズが異なることに注意してください。

table(dat$IndID, dat$Year) 

     2001 2002 2003 2005 
    AAA 26 27 20 27 
    BBB 20 30 30 20 

また、すべての年にデータがあるわけではありません。

dat %>% group_by(IndID, Year) %>% 
    summarise(NoDat = sum(is.na(Value))) %>% 
    as.data.frame() 
    IndID Year NoDat 
1 AAA 2001  0 
2 AAA 2002 27 
3 AAA 2003  0 
4 AAA 2005  0 
5 BBB 2001  0 
6 BBB 2002  0 
7 BBB 2003  0 
8 BBB 2005 20 

私はグループ内の特定の行を選択するための有用な例の数を見てきました(すなわち、トップ、最後の、Nなど、ランダム)が、グループ内のすべての行を選択する方法についてのドットを接続していないです。ここでは、無作為に選択された年のすべてのデータを各個人に、好ましくはdplyrとしたいと考えています。無作為な年は、データの有無に応じて異なる期間を与えられた各個人に固有でなければならない。無作為な年は、観察された1つの年である必要があり、それは個人によって異なる。

答えて

2

私は、これはあなたが探しているものであると考えている。(同じ可能性があり、その年に注意してください)

set.seed(123) 
dat <- data.frame(IndID = rep(c("AAA", "BBB"), each = 100), 
        Year = sample(c("2001", "2002", "2003", "2005"),200, replace = T), 
        Value = rnorm(200)) 
rand_year <- sample(dat$Year,1) 
dat %>% 
    filter(Year == rand_year) 

そして、ここでは、各参加者のランダムな年を取得し、編集されたバージョンです:

result <- dat %>% 
    group_by(IndID) %>% 
    filter(Year == sample(Year, 1)) 

filter()行をfilter(Year == sample(unique(Year[!is.na(Value)]), 1))に置き換えると、コメントに記載されているように、各年が選択され、欠損値が除外される確率が同じになります。

+0

私は 'dplyr'の外で働くことを考えていませんでした。質問とデータセットに具体的な内容を追加しました。具体的には、「NA」を数年間追加しました。ランダムな年が各個人ごとに異なる必要があります。 –

+0

slick。 2行目を 'filter(Year == sample(Year [!is.na(Value)]、1))'に変更して、 'NA'で年を除外することもできます。 –

+0

ああ、そうです。良い点は、サンプルサイズが不均一なベクトルをサンプリングしているため、確率は等しくありません。これはこの例では問題ありませんが、コメントに感謝します。 –

関連する問題