在不同行 r 之间的数据框中使用应用
use apply in dataframe between different rows r
我有一个df
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
并想创建一个新列,其功能基于比较 a[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 列。我反复认为 apply 更快,但不知道如何写,或者是否可能
也许你可以使用 dplyr
和 lag
?
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
你可以这样做:
a$d <- c(NA, tail(a$a, -1) - head(a$b, -1))
@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
my style
> 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
>
再快一点,
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
我有一个df
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
并想创建一个新列,其功能基于比较 a[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 列。我反复认为 apply 更快,但不知道如何写,或者是否可能
也许你可以使用 dplyr
和 lag
?
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
你可以这样做:
a$d <- c(NA, tail(a$a, -1) - head(a$b, -1))
@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
my style
> 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
>
再快一点,
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