在R中重复测量中选择重复的ID

时间:2015-09-23 14:30:41

标签: r duplicates measure

我有重复的数据。有两波。我想选择两次进行测试的人,所以他们的ID重复两次。有些人只做了一次,我想排除它们。我的数据是一种长结构格式。在数据结构中,有一个名为"的变量。 wave",标记为" 1"或" 2&#34 ;.所以,我的问题是我想要使用wave 1和wave 2获取ID。 这是我的数据:

id<-c(1, 2, 3,4,5,6,1,2,4)
wave<-c(1,1,2,1,2,2,2,2,2)
df<-cbind(id,wave)

因此1,2,4的ID有两个波,我想把它们拿出来。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

评论是正确的:你应该提供你的数据,一个你试图证明问题的例子,最好是一个所需输出的例子。请将来再做。

这是一个有希望模拟你的情况的例子:

set.seed(1)    # for reproducible example
df <- data.frame(ID=c(1:5,1:3),
                 wave=c(rep(1,5),rep(2,3)),
                 x=rnorm(8))
df
#   ID wave          x
# 1  1    1 -0.6264538
# 2  2    1  0.1836433
# 3  3    1 -0.8356286
# 4  4    1  1.5952808
# 5  5    1  0.3295078
# 6  1    2 -0.8204684
# 7  2    2  0.4874291
# 8  3    2  0.7383247

以下是在基础R中使用aggregate(...)的解决方案。

# base R solution
IDS <- aggregate(wave~ID,df, function(x)length(x)>1)
df[df$ID %in% IDS[IDS$wave,]$ID,]
#   ID wave          x
# 1  1    1 -0.6264538
# 2  2    1  0.1836433
# 3  3    1 -0.8356286
# 6  1    2 -0.8204684
# 7  2    2  0.4874291
# 8  3    2  0.7383247

以下是使用data.table的解决方案。

# data.table solution
library(data.table)
setDT(df)[,lapply(.SD,function(x)x[.N>1]),by=ID]
#    ID wave          x
# 1:  1    1 -0.6264538
# 2:  1    2 -0.8204684
# 3:  2    1  0.1836433
# 4:  2    2  0.4874291
# 5:  3    1 -0.8356286
# 6:  3    2  0.7383247

更简单的data.table解决方案(由@Arun提供)。

setDT(df)[, if (.N > 1L) .SD, by=ID]

所有这些选择任何具有超过1 (不完全是2)波的给定ID的行。