2013-04-18 12 views
6

私は、プレデータとポストデータからなる2つのデータセットを持っています。回答者はユニークなIDを持っており、両方のアンケートに回答した人のみを含むサブセットを作成したいと考えています。 例データセット:2つのデータセット内の一致するID

pre.data <- data.frame(ID = c(1:10), Y = sample(c("yes", "no"), 10, replace = TRUE), 
    Survey = 1) 

post.data <- data.frame(ID = c(1:3,6:10), Y = sample(c("yes", "no"), 8, replace = TRUE), 
    Survey = 2) 

all.data <- rbind(pre.data, post.data) 

私は、次の機能があります。

match <- function(dat1, dat2, dat3){ #dat1 is whole dataset(both stitched together) 
    #dat2 is pre dataset #dat3 is post dataset 
    selectedRows <- (dat1$ID %in% dat2$ID & 
        dat1$ID %in% dat3$ID) 

    matchdata <- dat1[selectedRows,] 
    return(matchdata) 
} 

prepost.match.data <- match(all.data, pre.data, post.data) 

を、私は同じことをやって、この機能をより良い方法がなければならないと思いますが、私はどのように考えることはできません。私はそれをどうやってやったのかちょっと混乱しているようです。つまり、それは機能します - それは私が望むことをしますが、より良い方法があると考えるのを助けることはできません。

これはすでに同様の方法で尋ねられていますが、見つけられなかった場合は申し訳ありませんが、その場合は関連する回答に向けてください。

+5

何かのように:与え

all.data[all.data$ID %in% intersect(pre.data$ID, post.data$ID),] 

は '%でall.data [all.data $のID%が交差する(pre.dataの$のIDを、post.data $ ID)、] '? – Arun

答えて

4

注:アルンは少し早く私よりコメントで同じ答えを掲載。

あなたはこのようなintersect使用することができます。

ID Y Survey 
1 1 yes  1 
2 2 no  1 
3 3 no  1 
6 6 yes  1 
7 7 yes  1 
8 8 yes  1 
9 9 no  1 
10 10 yes  1 
11 1 no  2 
12 2 yes  2 
13 3 no  2 
14 6 no  2 
15 7 yes  2 
16 8 yes  2 
17 9 no  2 
18 10 yes  2 
+0

これはまさに私が必要なものです、ありがとう! – Froom2

3

plyrの結合を見てください。

prepost.match.data <- join(pre.data, post.data, by = c("ID")) 
+0

これは、データを水平に結合します。これは、多くのアプリケーションでより有用になります。 –

+0

私は他の答えを受け入れるようにしていますが、これもうまくいきます。データをワイドフォーマットにしておきます。これは実際には多くの場所で役立ちますが、私の特定のニーズには役に立ちません。ありがとうございました! – Froom2

関連する問題