2015-09-23 34 views
-2

我有重複的數據。有兩波。我想選擇兩次進行測試的人,所以他們的ID會重複兩次。有些人只做過一次,我想排除他們。我的數據是一種長結構格式。在數據結構中,有一個名爲「wave」的變量,它被標記爲「1」或「2」。所以,我的問題是我想帶一個ID與第1波與波2 這裏是我的數據:在重複測量中選擇重複ID R

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,我想帶他們出去。任何想法?

+2

請問您是否可以發佈一些您的數據,最好是一個可以解釋手頭問題的片段? – erasmortg

+0

這裏有一些關於創建[可重現的例子]的信息(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Heroka

回答

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.

# 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 

使用aggregate(...)的解決方案下面是使用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的任何行。

+0

或者'setDT(df)[,if (.N> 1L).SD,按= ID]' – Arun

+0

哪個版本的data.table? – jlhoward

+0

應該適用於任何版本。你是哪一個人,這是什麼問題? – Arun