我有重复的数据。有两波。我想选择两次进行测试的人,所以他们的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有两个波,我想把它们拿出来。有什么想法吗?
答案 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的行。