2016-08-05 19 views
2

更快比方說,我創建了以下數據幀中的R創建的不同列中的R

c1 <- sample(10) 
c2 <- sample(10) 
c3 <- sample(10) 
df1 <- data.frame(c1, c2, c3) 

我想創建新的數據幀,是以DF1的當前行與前一行之間的差異。

當然,我可以手動創建如下:

c4 <- df1$c1[2:nrow(df1)]-df1$c1[1:(nrow(df1)-1)] 
c5 <- df1$c2[2:nrow(df1)]-df1$c2[1:(nrow(df1)-1)] 
c6 <- df1$c3[2:nrow(df1)]-df1$c3[1:(nrow(df1)-1)] 
df2 <- data.frame(c4, c5, c6) 

但不是有一個定義他們一個,如果有創建列的更有效的方法,我想知道。另外,如果有一種方法,如果我想「選擇」某些列有所不同,那麼一旦列出列名稱,是否有快速的方法呢?

+3

只是'DF1慢[-1,] - df1 [-nrow(df1),]' –

回答

1

我們通過列循環,得到lagshift並從原始值中減去它。我們將'data.frame'轉換爲'data.table'(setDT(df1))。

library(data.table) 
setnames(setDT(df1)[, lapply(.SD, function(x) (x- shift(x))[-1])], paste0("c", 4:6))[] 

或者使用dplyr

library(dplyr) 
df1 %>% 
    mutate_each(funs(. - lag(.))) %>% 
    na.omit() 

還是一個base R選項

tail(df1,-1) - head(df1,-1) 

或者另一種選擇是

sapply(df1, diff) 

然而,diff會比直接扣除或使用shift(作爲OP的帖子關注性能)

1

您可以使用diffapply它爲所有列

apply(df1, 2, diff)