2015-04-20 1 views
0

mydf выглядит следующим образом;использовать агрегат для возврата нуля, если критерии не выполняются

id<-c(1,1,2,2,3,3,4,4) 
type<-c("a","a","a","b","a","a","a","b") 
total<-c(1.1,1.2,2.1,2.3,3.4,3.6,4.2,4.3) 
mydf<-data.frame(id,type,total) 

Я хотел бы использовать агрегат, чтобы подвести итоги типа = Ъ, а для получения DF, который имеет все идентификационные номера. так а что с помощью

mydf.ag<-aggregate(total~id, sum, data=mydf) 

Я хотел бы использовать что-то вроде

mydf.ag<-aggregate(total~id, sum, data=mydf[mydf$type=="b",]) 

Но это возвращает только ФР с экземпляром типа = Ь. В идеале я хочу mydf.ag включать нули для идентификаторов 1 и 3. так mydf.ag должен выглядеть

mydf.ag<-data.frame(id=c(1,2,3,4), total=c(0,2.3,0,4.3)) 

Использование агрегата было бы идеально, но любые другие предложения приветствуются!

+0

' может потребоваться агрегат + слияние. 'merge (data.frame (id = unique (mydf $ id)), aggregate (total ~ id, sum, data = mydf [mydf $ type == 'b',]), all = TRUE)' и изменение NA до 0 – akrun

ответ

2

Это может быть сделано с data.table

library(data.table) 
setDT(mydf)[, list(total=sum(total[type=='b'])), id] 

Или dplyr

library(dplyr) 
mydf%>% 
    group_by(id) %>% 
    summarise(total=sum(total[type=='b'])) 
0

Или вы могли бы сначала установить Total равным нулю где type == "b" и запустить функцию совокупного

mydf[mydf$type != "b", "total"] <- 0 
aggregate(total~id, sum, data=mydf) 
Смежные вопросы