2017-04-04 3 views
4

私は参加者1人当たり1行のデータファイルを持っています(参加した調査に基づいて1-xという名前が付けられています)。すべての参加者がデータセットに存在するかどうかを確認したい。これは、研究は、彼らが参加した研究である、参加者はPERSONIDあり、私のおもちゃのデータセットです。このようになりますカウンタ変数のステップが欠落していないか確認してください。

df <- read.table(text = "personid study measurement 
1   x  23 
2   x  32 
1   y  21 
3   y  23 
4   y  23 
6   y  23", header=TRUE) 

:。

personid study measurement 
1  1 x   23 
2  2 x   32 
3  1 y   21 
4  3 y   23 
5  4 y   23 
6  6 y   23 

ので、yのために、私が行方不明です参加者2と5自動的にチェックするにはどうしたらいいですか?私は、カウンタ変数を追加して、そのカウンタ変数を参加者IDと比較しようとしましたが、一度参加者がいなくなると、そのアライメントがオフであるため、比較は無意味です。

df %>% group_by(study) %>% mutate(id = 1:n(),check = id==personid) 
Source: local data frame [6 x 5] 
Groups: date [2] 

    personid study measurement id check 
    <int> <fctr>  <int> <int> <lgl> 
1  1  x   23  1 TRUE 
2  2  x   32  2 TRUE 
3  1  y   21  1 TRUE 
4  3  y   23  2 FALSE 
5  4  y   23  3 FALSE 
6  6  y   23  4 FALSE 
+0

をあなたはここにしたい所望の出力とは何ですか?参加者が各調査に参加している場合、データベースの各行が真であるように、この「チェック」列を追加しようとしていますか? – MrFlick

+0

"チェック"列のアイデアが理想的ではないかもしれません。私の希望する出力は、 "yが参加者2と5がない"という行に沿ったものです。 – Esther

答えて

4

あなたpersonidがシーケンシャルであると仮定すると、あなたはstudypersonidのすべての可能な組み合わせを生成するためにtidy::expand()を使用し、削除するためにanti_join()を使用するように、すなわち、setdiff

library(dplyr) 

df %>% 
group_by(study) %>% 
mutate(new = toString(setdiff(max(personid):min(personid), personid))) 

#Source: local data frame [6 x 4] 
#Groups: study [2] 

# personid study measurement new 
#  <int> <fctr>  <int> <chr> 
#1  1  x   23  
#2  2  x   32  
#3  1  y   21 5, 2 
#4  3  y   23 5, 2 
#5  4  y   23 5, 2 
#6  6  y   23 5, 2 
3

一つのアプローチをされて使用してこれを行うことができます実際にデータに現れる組み合わせ。

library(dplyr, warn.conflicts = FALSE) 
library(tidyr) 

df %>% 
    expand(study, personid) %>% 
    anti_join(df) 
#> Joining, by = c("study", "personid") 
#> # A tibble: 4 × 2 
#> study personid 
#> <fctr> <int> 
#> 1  y  2 
#> 2  x  6 
#> 3  x  4 
#> 4  x  3 
+0

これは素晴らしいアイデアですが、これは実際には最も有用な出力です。この例では適切な出力は得られませんが、xについてはすべての数値が2(1:2)、すべてyが6(1:6)までとなることをスクリプトに伝えたいと思います。 – Esther

+0

Inその場合はexpand()を使用して可能な値の完全なセット – hadley

+0

を生成しますが、私が展開している別の最大値を持つ方法を頭で囲むことはできません。私は 'expand(c( "x"、 "y")、1:6)'を実行し、必要のない行を除外しますか?これを行うためのより論理的な方法があるように見えますか? – Esther

2

シンプルなソリューションベースのR

tapply(df$personid, df$study, function(a) setdiff(min(a):max(a), a)) 

に出力使用:

$x 
integer(0) 

$y 
[1] 2 5 
関連する問題