2015-09-03 3 views
1

Мне нужно найти, если элементы в столбце фрейма данных присутствуют в другом столбце фрейма данных, чтобы получить счет и общее количество.Пользователь grpl на каждом элементе столбца dataframe, чтобы найти строку в другом кадре данных.

Пример

кадр данных 1

Details<-data.frame(FirstName=c("Carlos SM","Carlos JOH","Carlos WIL","Carlos JON","Carlos BR","Peter D","Peter MILL","Peter WILS","Peter MOO","Homer T"),Points=c("3","4","7","6","4","9","1","2","1","9")) 

кадр данных 2

Results <- data.frame(Person=c("Carlos","Homer","Peter")) 

Идеальный выход будет добавить два столбца в кадре данных под названием Результаты одного для подсчета из раз каждая строка находится в кадре данных, а другая - для общей суммы очков. Как так

FirstName Appearances Total Points 
Carlos   5    24 
Perter   4    13 
Homer   2    13 
+1

Является 'Points' является числовой или символ переменной? Потому что в вашем примере его символ –

ответ

2

Это должно сделать трюк

Results$Appearances=sapply(Results$Person,function(x) sum(grepl(x,Details$FirstName))) 
Results$`Total Points`=sapply(Results$Person,function(x) sum(grepl(x,Details$FirstName)*as.numeric(Details$Points))) 
Results 
    Person Appearances Total Points 
1 Carlos   5   22 
2 Homer   1   7 
3 Peter   4   11 

Кроме того, кажется, что цифры в вашем ожидаемом результате немного откусили. Это действительно сбивает с толку. Это была ваша ошибка, или вам нужен какой-то неочевидный способ сопоставления персонажей, который принесет такой результат?

+0

Спасибо, я сделал ошибку в моей сумме результатов :) – Blas

0

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

library(tidyr) 
library(dplyr) 
Details %>% separate(FirstName, c("Person", "last"), " ") %>% 
      group_by(Person) %>% 
      summarise(Appearances = n(), 
         "Total Points" = sum(Points)) %>% 
      left_join(Results, .)