2016-07-29 6 views
2

У меня есть два кадра данных. df1 состоит из среднего размера параметра для отдельных пользователей. df2 содержит среднесуточное значение для одного и того же параметра для пользователей.Сравнение двух фреймов данных на основе условия

Я хочу, чтобы подсчитать количество дней для событий, где df2$size > df1$size для каждогоuser.

df1 = read.table(text='user size 
AAL0706 29000 
AAN0823 25000 
AAV0450 30000', stringsAsFactors=FALSE, header=TRUE) 


df2 = read.table(text='Date user size 
     2010-01-04 AAL0706 31054 
     2010-01-06 AAL0706 20703 
     2010-01-08 AAL0706 39968 
     2010-01-04 AAN0823 17892 
     2010-01-06 AAN0823 37839 
     2010-01-08 AAN0823 19649 
     2010-01-04 AAV0450 35432 
     2010-01-06 AAV0450 37839', stringsAsFactors=FALSE, header=TRUE) 

Ожидаемый результат:

user count 
AAL0706  2 
AAN0823  1 
AAV0450  2 

Я попытался использовать следующую команду, чтобы вычислить мои результаты, но я понимаю, что-то не так.

lapply(df1, function(y) { 
    ddply(df2$size, .(user), function(x) { 
     return(length(y$size(y$size > x$size)) 
    }) 
}) 

Не могли бы вы посоветовать мне эффективный способ сделать это?

ответ

1

Мы можем сделать left_join из dplyr, сгруппированных по 'пользователя' получить sum логического индекса (size.x > size.y)

library(dplyr) 
left_join(df2, df1, by = "user") %>% 
      group_by(user) %>% 
      summarise(Count = sum(size.x > size.y)) 
#  user Count 
#  <chr> <int> 
#1 AAL0706  2 
#2 AAN0823  1 
#3 AAV0450  2 

Или с помощью data.table

library(data.table) 
setDT(df2)[df1, .(count = sum(size > i.size)),on = "user", by = .EACHI] 
#  user count 
#1: AAL0706  2 
#2: AAN0823  1 
#3: AAV0450  2 
+1

Использование библиотеки «dplyr» было полезно для меня в замене большей части работы, которую я делал на функцию «aggregate». Я занимался проблемами памяти с «совокупной» функцией при обработке больших наборов данных. Я считаю, что пакет «dplyr» был хорошей альтернативой моей проблеме – Anna

1

немного более простой решение с использованием data.table было бы использовать новую функцию присоединения non-equi, доступную в c Текущая версия версии data.table, v1.9.7.

require(data.table) 
setDT(df2)[df1, .N, on=.(user, size > size), by=.EACHI] 

Каждая строка df1 сопоставляется всех строк df2 на основе состояния предоставленной on аргумента, то есть, подстать точное значение user и искать все строки, в которых size из df2 больше, в это user.

После получения совпадающих строк (для каждой строки) выражение .N (= количество совпадающих строк) оценивается для каждой строки, так как это означает by = .EACHI. Он инструктирует выполнить выражение, предоставленное второму аргументу j, для выполнения для каждогоi (первый аргумент).

См. Инструкцию по установке версии de here.

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