簡體   English   中英

使用在不同行之間的數據框中應用

[英]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列。 我反復說申請更快,但是不知道如何寫,或者是否可能

你可以做:

a$d <- c(NA, tail(a$a, -1) - head(a$b, -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

也許您可以使用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

@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

>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM