2015-05-03 2 views
2

Я пробовал часами с этим. У меня есть набор данных с двумя столбцами, давайте назовем их V1 и V2.I также имеет список imporatant значений V1 - Vx. Мне удалось получить подмножество V1 с функцией пересекается, так:Получение определенных строк в соответствии с подмножеством в R

intersect <- intersect(df$V1,Vx) 

Сейчас я отчаянно пытаюсь получить значения V2, соответствующие это подмножество. Я попытался с

subset <- df[intersect(df$V1,Vx),] 

Но это возвращает меня значения, которые все Nas. Так объяснить с другой случай: У меня есть набор данных

V1  V2 
a54 hi 
bc85 hk 
sdx637 hi 
vbd435 hk 

а также список, содержащий

l <- c("a54","sdx637") 

То, что я пытаюсь получить это:

V1  V2 
a54 hi 
sdx637 hi 

В I сказал, код, который я использовал, дает мне все НС, есть ли альтернативы? Большое спасибо.

ответ

3

Вы можете попробовать

subset(df, V1 %in% l) 
#  V1 V2 
#1 a54 hi 
#3 sdx637 hi 

intersect могут быть использованы для получения общих элементов

intersect(df$V1, l) 
#[1] "a54" "sdx637" 

, но это не даст логический индекс для подмножества данных,

df[intersect(df$V1, l),] 
#  V1 V2 
#NA <NA> <NA> 
#NA.1 <NA> <NA> 

Но %in% возвращает логический индекс, который будет полезен для подмножества.

Как уже упоминалось @Steven Бопре в комментариях, другие варианты включают [ или filter от dplyr

df[df$V1 %in% l,] 

Или

library(dplyr) 
    filter(df, V1 %in% l) 

Или

library(data.table) 
    setDT(df)[V1 %chin% l] 
+0

Спасибо, это похоже на работу , Однако есть еще одна вещь. Как вы думаете, что может быть причиной того факта, что мой l, скажем 300, длинный, но полученное подмножество длиннее? Есть ли дубликаты? –

+0

@sdgawerzswer Будут дубликаты для этой колонки. Вы можете проверить 'any (table (df $ V1)> 1)' , чтобы узнать, есть ли более одного элемента – akrun