2016-03-07 3 views
0

Пример данных:Выбор строки из кадра данных в соответствии с другим вектором, в том числе повторов

dates=seq(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-01-07 00:00:00"), by="day") 
data=rnorm(7,1,2) 
groupID=c(12,14,16,24,35,46,54) 

DF=data.frame(Date=dates,Data=data,groupID=groupID) 

BB=c(12,12,16,24,35,35) 
DF[DF$groupID %in% BB,] 

     Date  Data groupID 
1 2015-01-01 4.4104202  12 
3 2015-01-03 2.1557735  16 
4 2015-01-04 -0.9880946  24 
5 2015-01-05 -0.3396025  35 

мне нужно фильтровать кадр DF данных в соответствии со значениями в моем векторе BB, которые соответствуют столбец GroupID. Однако, если BB содержит повторения, это не отражается в результате.

Поскольку мой вектор BB включает в себя два значения 1, и два из 5, выход должен быть на самом деле:

 Date  Data groupID 
1 2015-01-01 4.4104202  12 
1 2015-01-01 4.4104202  12 
3 2015-01-03 2.1557735  16 
4 2015-01-04 -0.9880946  24 
5 2015-01-05 -0.3396025  35 
5 2015-01-05 -0.3396025  35 

Есть ли способ для достижения этой цели? И сохранить порядок вектора BB, если это возможно?

+2

Хммм, 'DF [BB,]'? –

+0

Я вижу, как мой вопрос наткнулся на этот путь. Я отредактировал его сейчас. Мой вектор «BB» должен соответствовать столбцу groupID, поэтому я не могу использовать ярлыки строк, которых я боюсь. – sym246

+1

Может быть, 'DF [match (BB, DF $ groupID),]' then? –

ответ

1

Использование match() (или findInterval()):

DF[match(BB,DF$groupID),]; 
##   Date  Data groupID 
## 1 2015-01-01 1.2199835  12 
## 1.1 2015-01-01 1.2199835  12 
## 3 2015-01-03 1.8141556  16 
## 4 2015-01-04 0.2748579  24 
## 5 2015-01-05 3.2030200  35 
## 5.1 2015-01-05 3.2030200  35 

(Обратите внимание, что Data колонка отличается тем, что вы использовали rnorm() для его генерации без вызова set.seed() первый Рекомендуется называть set.seed() в любом образце кода, где вы. включить случайность, так что точные результаты могут быть воспроизведены.)

+0

Спасибо - это именно то, что я ищу :) – sym246

0

Вы можете превратить BB в data.frame и использовать merge() слиться DF и BB в соответствии с их groupID, чтобы быть конкретным: Результат

dates=seq(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-01-07 00:00:00"), by="day") 
groupID=c(12,14,16,24,35,46,54) 
set.seed(1234) 
data=rnorm(7,1,2) 
DF=data.frame(Date=dates,Data=data,groupID=groupID) 
BB=data.frame(groupID=c(12,12,16,24,35,35)) 

Тест:

>merge(DF,BB,by="groupID") 
    groupID  Date  Data 
1  12 2015-01-01 -1.414131 
2  12 2015-01-01 -1.414131 
3  16 2015-01-03 3.168882 
4  24 2015-01-04 -3.691395 
5  35 2015-01-05 1.858249 
6  35 2015-01-05 1.858249 

 Смежные вопросы

  • Нет связанных вопросов^_^