2015-05-19 28 views
12

मेरे dataframe का उपयोग कर राशि इस तरह दिखता है और मैं दो अलग संचयी कॉलम, निधि एक के लिए एक और फंड बीसशर्त संचयी dplyr

Name Event SalesAmount Fund Cum-A(desired) Cum-B(desired) 
John Webinar NA   NA  NA    NA 
John Sale  1000   A  1000    NA 
John Sale  2000   B  1000    2000 
John Sale  3000   A  4000    2000 
John Email NA    NA  4000    2000 
Tom  Webinar NA   NA  NA    NA 
Tom  Sale  1000   A  1000    NA 
Tom  Sale  2000   B  1000    2000 
Tom  Sale  3000   A  4000    2000 
Tom  Email NA    NA  4000    2000 

I have tried: 
df<- 
    df %>% 
    group_by(Name)%>% 
    mutate(Cum-A = as.numeric(ifelse(Fund=="A",cumsum(SalesAmount),0)))%>% 
    mutate(Cum-B = as.numeric(ifelse(Fund=="B",cumsum(SalesAmount),0))) 

के लिए अन्य चाहते हैं, लेकिन यह पूरी तरह से नहीं है जो मैं चाहता रूप में यह मुझे पता चलता धनराशि मैच होने पर केवल दोनों पंक्तियों के चलते, दोनों फंडों का रनटाउंड। कृपया मदद करें।

उत्तर

8

कैसे के बारे में:

library(dplyr) 

d %>% 
    group_by(Name) %>% 
    mutate(cA=cumsum(ifelse(!is.na(Fund) & Fund=="A",SalesAmount,0))) %>% 
    mutate(cB=cumsum(ifelse(!is.na(Fund) & Fund=="B",SalesAmount,0))) 

उत्पादन:

Source: local data frame [10 x 8] 
Groups: Name 

    Name Event SalesAmount Fund Cum.A.desired. Cum.B.desired. cA cB 
1 John Webinar   NA NA    NA    NA 0 0 
2 John Sale  1000 A   1000    NA 1000 0 
3 John Sale  2000 B   1000   2000 1000 2000 
4 John Sale  3000 A   4000   2000 4000 2000 
5 John Email   NA NA   4000   2000 4000 2000 
6 Tom Webinar   NA NA    NA    NA 0 0 
7 Tom Sale  1000 A   1000    NA 1000 0 
8 Tom Sale  2000 B   1000   2000 1000 2000 
9 Tom Sale  3000 A   4000   2000 4000 2000 
10 Tom Email   NA NA   4000   2000 4000 2000 

जिसके परिणामस्वरूप स्तंभों में जीरो NA द्वारा बदला जा सकता है बाद में अगर जरूरत:

result$cA[result$cA==0] <- NA 
result$cB[result$cB==0] <- NA 

आपका इनपुट डेटा सेट:

d <- structure(list(Name = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L,  2L, 2L, 2L), .Label = c("John", "Tom"), class = "factor"), Event = structure(c(3L,  2L, 2L, 2L, 1L, 3L, 2L, 2L, 2L, 1L), .Label = c("Email", "Sale",  "Webinar"), class = "factor"), SalesAmount = c(NA, 1000L, 2000L,  3000L, NA, NA, 1000L, 2000L, 3000L, NA), Fund = structure(c(NA,  1L, 2L, 1L, NA, NA, 1L, 2L, 1L, NA), .Label = c("A", "B"), class = "factor"),   Cum.A.desired. = c(NA, 1000L, 1000L, 4000L, 4000L, NA, 1000L,   1000L, 4000L, 4000L), Cum.B.desired. = c(NA, NA, 2000L, 2000L,   2000L, NA, NA, 2000L, 2000L, 2000L)), .Names = c("Name",  "Event", "SalesAmount", "Fund", "Cum.A.desired.", "Cum.B.desired." ), class = "data.frame", row.names = c(NA, -10L)) 
+0

"एस" 'घटना के बाद लापता =" एस "डेटा में tructure' –

+0

धन्यवाद सेट @ StevenBeaupré –

+0

' घटना == "बिक्री" 'एक अच्छे तरह से हो सकता है लिखने के लिए '! is.na (फंड) 'यदि ओपी का डेटा अनुमति देता है। – Frank

2

आप थोड़ा यह सब रोलिंग द्वारा @ मरात का जवाब छोटा कर सकते हैं एक भी mutate में:

df %>% 
    group_by(Name) %>% 
    mutate(
    cA = cumsum(ifelse(!is.na(Fund) & Fund == "A", SalesAmount, 0)), 
    cB = cumsum(ifelse(!is.na(Fund) & Fund == "B", SalesAmount, 0)), 
    cA = ifelse(cA == 0, NA, cA), 
    cB = ifelse(cB == 0, NA, cB) 
) 
+1

हाँ अच्छा बिंदु यह आवश्यक नहीं है - धन्यवाद – ivyleavedtoadflax

+3

यह @Marats उत्तर के तहत सिर्फ एक टिप्पणी होनी चाहिए। –

+1

सहमत हैं, लेकिन अभी तक टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है। – ivyleavedtoadflax

3

यहाँ एक दृष्टिकोण, अधिक धनराशि के सामान्यीकरण zoo और data.table का उपयोग कर रहा है:

# prep 
require(data.table) 
require(zoo) 
setDT(d) 
d[,Fund:=as.character(Fund)]   # because factors are the worst 
uf <- unique(d[Event=="Sale"]$Fund) # collect set of funds 

पहले, अवलोकनों के प्रासंगिक सबसेट पर संचयी बिक्री असाइन करें:

for (f in uf) d[(Event=="Sale"&Fund==f),paste0('c',f):=cumsum(SalesAmount),by=Name] 

फिर, पिछले प्रेक्षण को आगे बढ़ाने:

d[,paste0('c',uf):=lapply(.SD,na.locf,na.rm=FALSE),.SDcols=paste0('c',uf),by=Name]