在R

时间:2016-08-05 08:06:55

标签: r dataframe

我们说我在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)

但我不想一个接一个地定义它们,我想知道是否有更有效的方法来创建列。

另外,如果有办法,如果我想&#34;选择&#34;某些列有所不同,有一个快速的方法,一旦我有列名列表?

2 个答案:

答案 0 :(得分:1)

我们遍历列,获取lag shift并从原始值中减去它。我们转换了'data.frame&#39;到&#39; data.table&#39; (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 :(得分:1)

您可以将diffapply用于所有列

apply(df1, 2, diff)