如何仅选择两个数据集中存在的那些案例?

时间:2015-10-21 09:07:42

标签: r

问题简介

我有一个由两个数据集组成的数据集。一个包含基线数据(t1),另一个包含后续数据(t2)。并非基线数据中的所有情况都存在于后续数据中,并且并非后续数据中的所有情况都存在于基线数据中。

目标

我想只选择两个数据集中存在的那些案例。 为此,我将两个数据集合并在一起。

数据示例

      ID     Tn    Score 1    ......   Score n
1      1     t1      1        ......      n
2      1     t2      1        ......      n
3      2     t1      1        ......      n
4      3     t2      2        ......      n
5      4     t1      3        ......      n
6      4     t2      1        ......      n
7      5     t1      2        ......      n
8      6     t2      1        ......      n
9      7     t1      5        ......      n
10     7     t2      4        ......      n

在我的例子中(上文),我因此希望案例1,4和7用于后续分析。

我尝试了什么

我尝试使用unique()和duplicated(),但到目前为止我还没有找到可行的解决方案。

3 个答案:

答案 0 :(得分:2)

您也可以使用基础R ...

rbind(merge(merge(subset(subset(df1,Tn == 't1'),select=c(ID)),subset(subset(df1,Tn == 't2'),select=c(ID)),by="ID"),subset(subset(df1,Tn == 't1'),by='ID')),merge(merge(subset(subset(df1,Tn == 't1'),select=c(ID)),subset(subset(df1,Tn == 't2'),select=c(ID)),by="ID"),subset(subset(df1,Tn == 't2'),by='ID')))

另一种更优雅的方式是......

subset(df1,(ID %in% subset(df1,select=c(ID), Tn == 't1')$ID) & (ID %in% subset(df1,select=c(ID), Tn == 't2')$ID))

答案 1 :(得分:1)

我们可以使用data.table。我们转换了' data.frame'到' data.table' (setDT(df1),按' ID'分组,if unique计数' Tn'等于2,我们对数据进行子集。 (.SD)。

library(data.table)#v1.9.6+
setDT(df1)[, if(uniqueN(Tn)==2) .SD, ID]
#   ID Tn Score1 Score2
#1:  1 t1      1      1
#2:  1 t2      1      3
#3:  4 t1      3      2
#4:  4 t2      1      1
#5:  7 t1      5      1
#6:  7 t2      4      5

或使用base R

 df1[df1$ID %in% names(which(rowSums(table(df1[1:2]))==2)) ,]

数据

df1 <- structure(list(ID = c(1L, 1L, 2L, 3L, 4L, 4L, 5L, 6L, 7L, 7L), 
Tn = c("t1", "t2", "t1", "t2", "t1", "t2", "t1", "t2", "t1", 
"t2"), Score1 = c(1L, 1L, 1L, 2L, 3L, 1L, 2L, 1L, 5L, 4L), 
Score2 = c(1L, 3L, 2L, 4L, 2L, 1L, 1L, 4L, 1L, 5L)), .Names = c("ID", 
"Tn", "Score1", "Score2"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

答案 2 :(得分:1)

df1[which(df1$ID  %in% df1[duplicated(df1$ID), ]$ID), ]

#ID Tn Score1 Score2
#1   1 t1      1      1
#2   1 t2      1      3
#5   4 t1      3      2
#6   4 t2      1      1
#9   7 t1      5      1
#10  7 t2      4      5