2014-02-04 2 views
0

У меня есть большой кадр данных, где большинство предметов имеет пару наблюдений, такие как, что:Как извлечь спаренные строки из кадра данных в R

set.seed(123) 
df<-data.frame(ID=c(letters[1:4],letters[1:6]),x=sample(1:5,10,T)) 
    ID x 
1 a 2 
2 b 4 
3 c 3 
4 d 5 
5 a 5 
6 b 1 
7 c 3 
8 d 5 
9 e 3 
10 f 3 

Я бы извлечь строки, все идентификаторы парные, такие как:

ID x 
1 a 2 
5 a 5 
2 b 4 
6 b 1 
3 c 3 
7 c 3 
4 d 5 
8 d 5 

Каков наилучший способ сделать это в R?

ответ

2

Вы можете использовать ave, чтобы получить length каждого значения в df$ID и использовать, чтобы подмножество вашего data.frame:

out <- df[as.numeric(ave(as.character(df$ID), df$ID, FUN = length)) == 2, ] 
out 
# ID x 
# 1 a 2 
# 2 b 4 
# 3 c 3 
# 4 d 5 
# 5 a 5 
# 6 b 1 
# 7 c 3 
# 8 d 5 

Использование order для сортировки вывода, если это необходимо.

out[order(out$ID), ] 

Вы также можете посмотреть в использовании data.table:

dt <- data.table(df, key = "ID") # Also sorts the output 
dt[, n := .N, by = "ID"][n == 2] 
2

Кроме того, я предпочитаю использовать duplicated:

> df[df$ID %in% df$ID[duplicated(df$ID)],] 
    ID x 
1 a 2 
2 b 1 
3 c 5 
4 d 5 
5 a 4 
6 b 2 
7 c 3 
8 d 4 
Смежные вопросы