我们说我在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;某些列有所不同,有一个快速的方法,一旦我有列名列表?
答案 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)
您可以将diff
和apply
用于所有列
apply(df1, 2, diff)