2016-02-03 3 views
2

Я пытаюсь выяснить, как отбирать уникальные значения фактора (уникальный идентификатор) в кадре данных - с заменой - - и затем используйте эти (повторяющиеся) выборочные значения, чтобы получить индексы значений уникального идентификатора для выборки.Извлечение индексов кадра данных на основе выборок (с заменой) фактора

Конкретно, скажем, у меня есть набор данных (повторяющихся) букв и цифр. Я хочу выбрать уникальные значения букв, а затем вернуть индексы фрейма данных, соответствующие буквам, которые я выбрал.

set.seed(1) 
df = data.frame(l = rep(letters,2), v = 1:52) 
sampvec <- sample(letters, 10, replace = TRUE) 
length(unique(sampvec))#Fewer than 10 unique values 
idx <- which(df$l %in% sampvec) 
length(idx) #there should be 20, but there are 18, because one of the letters is duplicated 

Это тривиально, чтобы сделать с for цикла, но будет слишком медленным, с реальными данными:

idx <- c() 
for (i in 1:length(sampvec)){ 
    idx <- append(idx, which(df$l %in% sampvec[i])) 
} 

Любой векторизованного способ сделать это?

+0

@Jota Если буква "А" пройдены дважды, я хочу, индексы '[1,27]' дважды появляется в 'idx' –

+0

@Henrik очень умное использование' merge'! Я думаю, что это работает. Сделайте это ответом, если вы хотите, чтобы некоторые пункты –

+0

вы проверили, работает ли ниже? можете ли вы также показать, что находится в вашем sampvec? – mtoto

ответ

0

Вы можете использовать функцию matchAll() из пакета tuple. В отличие от match(), он идентифицирует все совпадающие значения, а не только первые. Нижеследующее предполагает, что l$v равен номеру индекса, как в вашем примере.

library(tuple) 
x[matchAll(sampvec, x$l),]$v 
#[1] 7 10 15 24 6 24 25 18 17 2 33 36 41 50 32 50 51 44 43 28