我有两组数据,包括pre和post数据。受访者拥有唯一的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)
我认为必须有比这个做同样事情的功能更好的方法,但我想不出怎么做。我怎么做它似乎有点乱。我的意思是,它有效 - 它做了我想要的,但我不能帮助你思考,这是一个更好的方法。
我很抱歉,如果已经以类似的方式提出这个问题,但我无法找到它 - 在这种情况下,请指出我的相关答案。
答案 0 :(得分:6)
注意: Arun在比我更早的评论中发布了相同的答案。
您可以像这样使用intersect
:
all.data[all.data$ID %in% intersect(pre.data$ID, post.data$ID),]
给出了:
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
答案 1 :(得分:4)
看看加入plyr。
prepost.match.data <- join(pre.data, post.data, by = c("ID"))