我有一个由两个数据集组成的数据集。一个包含基线数据(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(),但到目前为止我还没有找到可行的解决方案。
答案 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