2016-04-14 41 views
0

我有DF使用适用于数据帧之间不同的行 - [R

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 

并想使一个新的列,由一个[N]的值用b比较基于其功能[N-1]并想知道我是否可以使用apply函数而不是for循环。

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

,然后我想最后一列到原来的绑定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 

我真正的DF是3825966个21列。我反复提到申请更快,但不知道如何写出来,或者如果有可能的话

+0

'一个$ d < - C(NA,尾部(一个$一个,-1) - 头($ B,-1))' – jogo

+0

工作惊人。感谢jogo! – alex

回答

1

你可以这样做:

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

也许你可以使用dplyrlag

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解决方案的伟大工程。

从我身边的一些基准测试结果: JOGO风格

> 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 

我的风格

> 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

更快再次,

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

基准:

> 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