2016-06-22 3 views
0

Я пытаюсь реализовать функцию типа vlookup в R. У меня два кадра данных: Столбец Идентификатор имеет уникальные значения.Сравнение двух столбцов разной длины в R

# DataFrame1 - df1 
Data ID  C1  C2  C3 
R1  ax  12  33  11 
R2  ay  11   2  0 
R3  az  3   3  0 
R4  ar  2   3  1 
R5  ag  2   3  1 

# DataFrame2 - df2 
Id 
ax 
ay 

Я хочу, чтобы получить все данные и получить его количество от DataFrame1, для которых существует соответствие между идентификатором с DataFrame2 и DataFrame1.

Выход должен быть -

Data ID C1 C2 C3 
R1 ax 12 33 11 
R2 ay 11 2 0 

и его счет будет 2

Кроме того, возможно ли это без функции слияния?

+2

проверить '% in%' или 'match'. – Psidom

+0

@Joe: Повторите запрос на неточное совпадение: так как ваш вопрос в настоящий момент на самом деле не запрашивает это решение, вам следует искать SO, и если вы не можете найти ответ на другой вопрос с примером, который фактически повышает вероятность неточное совпадение. Я знаю, что я ответил на аналогичный вопрос раньше, но возможно, что вы не найдете его поисковым термином «нечеткое соответствие». Попробуйте «частичную» или «неточную». –

ответ

3

к подмножеству свой первый dataframe вашим вторым, а затем подсчитать количество строк:

z=df1[df1$ID %in% df2$Id,] 
count=nrow(z) 
+0

Будет ли эта функция выполнять точное совпадение? Я имею в виду, если у нас есть ID ax в одном кадре данных и ID axh во втором кадре данных, будет ли этот метод идентифицировать разницу? – Joe

+1

@Joe Возможно, вы захотите заглянуть в «нечеткое соответствие», если у вас точно не совпадают идентификаторы. – Frank

+1

«Какой» лишний. Просто использование 'df1 $ ID% в% df2 $ Id', поскольку аргумент' i' будет более эффективным. –

0

Использование dplyr:

library(dplyr) 
inner_join(df1, df2, by = c("ID" = "Id")) # Because Id columns names are different 
inner_join(df1, df2) # If the Id columns were the same 

Использование sqldf:

library(sqldf) 
sqldf('SELECT * FROM df1 JOIN df2 USING (ID)') # Not case sensitive 

Выход:

Data ID C1 C2 C3 
1 R1 ax 12 33 11 
2 R2 ay 11 2 0