आर

2012-05-18 42 views
13

में डेटा.फ्रेम के भीतर समूहों में फ़ंक्शन को लागू करें। मैं डेटाफ्रेम के भीतर समूहों ("ए" और "बी") के लिए एक चर (v) के संचयी योग प्राप्त करने का प्रयास कर रहा हूं। मैं परिणाम को नीचे कैसे प्राप्त कर सकता हूं - जिनकी पंक्तियों को भी ठीक से गिना जाता है - मेरे डेटाफ्रेम के कॉलम सीएस में?आर

> library(nlme) 
> g <- factor(c("a","b","a","b","a","b","a","b","a","b","a","b")) 
> v <- c(1,4,1,4,1,4,2,8,2,8,2,8) 
> cs <- rep(0,12) 
> d <- data.frame(g,v,cs) 

> d 
    g v cs 
1 a 1 0 
2 b 4 0 
3 a 1 0 
4 b 4 0 
5 a 1 0 
6 b 4 0 
7 a 2 0 
8 b 8 0 
9 a 2 0 
10 b 8 0 
11 a 2 0 
12 b 8 0 

> r=gapply(d,FUN="cumsum",form=~g, which="v") 
>r 

$a  
    v 
1 1 
3 2 
5 3 
7 5 
9 7 
11 9 

$b  
    v 
2 4 
4 8 
6 12 
8 20 
10 28 
12 36 

> str(r) 
List of 2 
$ a:'data.frame': 6 obs. of 1 variable: 
    ..$ v: num [1:6] 1 2 3 5 7 9 
$ b:'data.frame': 6 obs. of 1 variable: 
    ..$ v: num [1:6] 4 8 12 20 28 36 

मुझे लगता है मैं घ $ सीएस में उन dataframes से डेटा प्राप्त करने के लिए कुछ श्रमसाध्य तरह से यह पता लगाने सकता है, लेकिन वहाँ कुछ आसान ट्वीक मैं याद कर रहा हूँ हो गया है।

उत्तर

10

मैं का प्रयोग करेंगे करने के लिए अग्रणी है ave। यदि आप ave के स्रोत को देखते हैं, तो आप देखेंगे कि यह अनिवार्य रूप से मार्टिन मॉर्गन के solution को लपेटता है।

R> g <- factor(c("a","b","a","b","a","b","a","b","a","b","a","b")) 
R> v <- c(1,4,1,4,1,4,2,8,2,8,2,8) 
R> d <- data.frame(g,v) 
R> d$cs <- ave(v, g, FUN=cumsum) 
R> d 
    g v cs 
1 a 1 1 
2 b 4 4 
3 a 1 2 
4 b 4 8 
5 a 1 3 
6 b 4 12 
7 a 2 5 
8 b 8 20 
9 a 2 7 
10 b 8 28 
11 a 2 9 
12 b 8 36 
+0

मैं हमेशा 'एवी' के बारे में भूल जाता हूं; हालांकि वही 2 अन्य के रूप में आ गया है? –

+0

@ टाइलर रिंकर: यह अनिवार्य रूप से मार्टिन के समाधान के समान है (मेरा संपादन देखें)। –

+0

मैं जोरन की तुलना में बी/सी उलझन में था। मैं प्लीयर चीजों को पुनर्व्यवस्थित भूल गया। +1 –

7

इन बातों के लिए पसंद की मेरे उपकरण plyr पैकेज है:

require(plyr) 
> ddply(d,.(g),transform,cs = cumsum(v)) 
    g v cs 
1 a 1 1 
2 a 1 2 
3 a 1 3 
4 a 2 5 
5 a 2 7 
6 a 2 9 
7 b 4 4 
8 b 4 8 
9 b 4 12 
10 b 8 20 
11 b 8 28 
12 b 8 36 
13

split<- एक बहुत अजीब जानवर

split(d$cs, d$g) <- lapply(split(d$v, d$g), cumsum) 

> d 
    g v cs 
1 a 1 1 
2 b 4 4 
3 a 1 2 
4 b 4 8 
5 a 1 3 
6 b 4 12 
7 a 2 5 
8 b 8 20 
9 a 2 7 
10 b 8 28 
11 a 2 9 
12 b 8 36 
+3

यही था 'विभाजित <ऑर्डर करने के लिए किया था -। Default'। मुझे एहसास नहीं हुआ कि यह अस्तित्व में था (या यह कि एवी के लिए आधार था।) 'विभाजन <- डेटा.फ्रेम' भी वीडर है। –

0
> library(nlme) 
> g <- factor(c("a","b","a","b","a","b","a","b","a","b","a","b")) 
> v <- c(1,4,1,4,1,4,2,8,2,8,2,8) 
> cs <- rep(0,12) 
> d <- data.frame(g,v,cs) 
> d <- d[order(d$g),] 
> temp <- by(d$v,d$g,cumsum) 
> d$cs <- do.call("c",temp) 
> d 
    g v cs 
1 a 1 1 
3 a 1 2 
5 a 1 3 
7 a 2 5 
9 a 2 7 
11 a 2 9 
2 b 4 4 
4 b 4 8 
6 b 4 12 
8 b 8 20 
10 b 8 28 
12 b 8 36 

एक अन्य समाधान समारोह से उपयोग कर रहा है, लेकिन मैं डेटा पहले