2016-04-14 9 views
0

r habe ich eine dfVerwendung gelten in Datenrahmen zwischen den verschiedenen Reihen

a=1:10000 
b=1:10000 
a=data.frame(a,b) 
> head(a) 
    a b 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
6 6 6 

und möchte eine neue Spalte machen, seine Funktion basiert, indem der Wert von a [n] mit b verglichen [n-1] und frage mich, ob ich statt einer for-Schleife eine Funktion anwenden kann.

d=0 
for(i in 1:dim(a)[1]){d=c(d,a[i,1]-a[i-1,2])} 

und dann würde Ich mag die letzte Spalte zur ursprünglichen df

a=data.frame(a,d) 
> head(a) 
    a b d 
1 1 1 0 
2 2 2 1 
3 3 3 1 
4 4 4 1 
5 5 5 1 
6 6 6 1 

habe ich wirklich df 3.825.966 und 21 Spalten binden. Ich wiederhole immer wieder, dass die Anwendung schneller ist, aber ich weiß nicht, wie ich das schreiben soll, oder wenn es möglich ist

+0

'a $ d <- c (NA, Schwanz (a $ a, -1) - Kopf (a $ b, -1))' – jogo

+0

erstaunlich funktioniert. Danke jogo! – alex

Antwort

1

können Sie tun:

a$d <- c(NA, tail(a$a, -1) - head(a$b, -1)) 
0

Vielleicht können Sie dplyr und lag verwenden?

library(dplyr) 
a %>% mutate(lagb=lag(b)) %>% mutate(d = a-lagb) %>% head() 
# a b lagb d 
# 1 1 1 NA NA 
# 2 2 2 1 1 
# 3 3 3 2 1 
# 4 4 4 3 1 
# 5 5 5 4 1 
# 6 6 6 5 1 
0

@jogo Lösung funktioniert super.

einige Benchmark-Ergebnisse von meiner Seite: jogo Stil

> a=1:100000 
> b=1:100000 
> a=data.frame(a,b) 
> t=Sys.time() 
> a$d <- c(NA, tail(a$a, -1) - head(a$b, -1)) 
> Sys.time()-t 
Time difference of 0.02101493 secs 
> #time took 0 sec 

mein Stil

> a=1:100000 
> b=1:100000 
> a=data.frame(a,b) 
> t=Sys.time() 
> d=0 
> for(i in 1:dim(a)[1]){d=c(d,a[i,1]-a[i-1,2])} 
> Sys.time()-t 
Time difference of 48.94479 secs 

>

1

wieder schneller,

a$d <- a$a - c(NA, a$b[-length(a$b)]) 

Benchmark:

> a=rnorm(1000000, 0, 5) 
> b=rnorm(1000000, 0, 10) 
> a=data.frame(a,b) 
> t <- Sys.time() 
> a$d <- a$a - c(NA, a$b[-length(a$b)]) 
> Sys.time() - t 
Time difference of 0.03000093 secs 
> 
> t=Sys.time() 
> a$d <- c(NA, tail(a$a, -1) - head(a$b, -1)) 
> Sys.time()-t 
Time difference of 0.06505489 secs 
Verwandte Themen