这是dplyr方法。
使用mutate()
添加一个新的colum和来计算您的变量。例如:
library(dplyr)
d <- data.frame(
x = 1:10,
y = 11:20,
z = 21:30
)
mutate(d, sumx = x + lag(x, default = 0))
#> x y z sumx
#> 1 1 11 21 1
#> 2 2 12 22 3
#> 3 3 13 23 5
#> 4 4 14 24 7
#> 5 5 15 25 9
#> 6 6 16 26 11
#> 7 7 17 27 13
#> 8 8 18 28 15
#> 9 9 19 29 17
#> 10 10 20 30 19
以上的变量可以类似地处理:
mutate(d, sumx = x + lag(x, default = 0), sumy = y + lag(y, default = 0))
#> x y z sumx sumy
#> 1 1 11 21 1 11
#> 2 2 12 22 3 23
#> 3 3 13 23 5 25
#> 4 4 14 24 7 27
#> 5 5 15 25 9 29
#> 6 6 16 26 11 31
#> 7 7 17 27 13 33
#> 8 8 18 28 15 35
#> 9 9 19 29 17 37
#> 10 10 20 30 19 39
如果您知道您要为多,或在您的数据帧,甚至每一列这样做,那么这里有一个标准的评价方法与mutate_()
使用自定义函数我改编自this blog post(注意您需要安装lazyeval包)。该函数被应用于for循环中的每一列(可能会被优化)。
f <- function(df, col, new_col_name) {
mutate_call <- lazyeval::interp(~ x + lag(x, default = 0), x = as.name(col))
df %>% mutate_(.dots = setNames(list(mutate_call), new_col_name))
}
for (var in names(d)) {
d <- f(d, var, paste0('sum', var))
}
d
#> x y z sumx sumy sumz
#> 1 1 11 21 1 11 21
#> 2 2 12 22 3 23 43
#> 3 3 13 23 5 25 45
#> 4 4 14 24 7 27 47
#> 5 5 15 25 9 29 49
#> 6 6 16 26 11 31 51
#> 7 7 17 27 13 33 53
#> 8 8 18 28 15 35 55
#> 9 9 19 29 17 37 57
#> 10 10 20 30 19 39 59
只是继续tidyverse主题,下面是一个使用purrr封装解决方案(同样适用于所有列,但子集列,如果需要):
library(purrr)
# Create new columns in new data frame.
# Subset `d` here if only want select columns
sum_d <- map_df(d, ~ . + lag(., default = 0))
# Set names correctly and
# bind back to original data
names(sum_d) <- paste0("sum", names(sum_d))
d <- cbind(d, sum_d)
d
#> x y z sumx sumy sumz
#> 1 1 11 21 2 22 42
#> 2 2 12 22 4 24 44
#> 3 3 13 23 6 26 46
#> 4 4 14 24 8 28 48
#> 5 5 15 25 10 30 50
#> 6 6 16 26 12 32 52
#> 7 7 17 27 14 34 54
#> 8 8 18 28 16 36 56
#> 9 9 19 29 18 38 58
#> 10 10 20 30 20 40 60
非常感谢!这工作得很好。我不得不承认,我有更多的操作要做,而不仅仅是总结2个值。(dfSomeFrame,SumX = abs((dfSomeFrame $ X - lag(dfSomeFrame $ X,default = 0)))^ 2) dfSomeFrame $ SumX [1] < - 0' – BlainTheMono
这样'mutate'的结果被写回到我的data.frame中,所以可以用Y做更多的操作,甚至可以构建一个新的SUMZ和SumY列。 (不知何故'lag(..)'中的'default = 0'不起作用,所以我不得不使用'dfSomeFrame $ SumX [1] < - 0')。再次感谢 – BlainTheMono
太棒了!很少有事情需要修改:在mutate()中,你不需要重用'dfSomeFrame $'。相反,尝试'dfSomeFrame < - mutate(dfSomeFrame,SumX = abs((X-lag(X,default = 0)))^ 2)'。 –