2014-02-16 6 views
0
df <- data.frame(name=c('aa', 'bb', 'cc','dd'), 
       code=seq(1:4), value= seq(100, 400, by=100)) 
df 

v <- c(1, 2, 2) 
v 

A <- df[df$code %in% v,]$value 
A 

str(A) 

Я попытался получить соответствующее значение на основе кода. Я ожидал, что A будет иметь длину 3; но он фактически возвращает вектор 2. Что я могу сделать, если я хочу, чтобы A был вектором 3, то есть c(100,200,200)?R индекс на основе вектора

+1

Используйте 'match' вместо'% в% ':' ДФ [матч (v, ДФ $ код), 'значение'] ' – jbaums

+0

не просто означает,' DF (V, 2) '? – PascalVKooten

+0

@PascalvKooten: Я не думаю, что ... если 'v' - вектор кодов, а не вектор индексов. – jbaums

ответ

2

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

Наоборот, функция match возвращает для каждого элемента вектора 1 положение в векторе 2, где сначала появляется элемент (или NA, если он не существует в векторе 2) , Попробуйте следующее:

df[match(v, df$code), 'value'] 
0

Вы могли бы просто использовать v в качестве аргумента, если это были строки, в которых «значение» s вы хотите:

> df[v,]$value 
[1] 100 200 200 
+0

Только потому, что в этом случае 'df $ code' совпадает с индексом строки. –

0
df[v,2] # minimum characters :) 
+0

Только потому, что в этом случае 'df $ code' совпадает с индексом строки. –

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