在R中使用lappy迭代列时计算行值的百分比变化
我有一个数据框架,其中包含大量变量的每周值。我希望遍历每一列,并获得每行的每周变化和以百分比表示的变量 例如:在R中使用lappy迭代列时计算行值的百分比变化,r,loops,data.table,iteration,lapply,R,Loops,Data.table,Iteration,Lapply,我有一个数据框架,其中包含大量变量的每周值。我希望遍历每一列,并获得每行的每周变化和以百分比表示的变量 例如: a = c(2,3,1,9) b = c(4,5,8,1) sentiment = cbind(a,b) %>% as.data.frame()` Outcome should be: a b a_delta b_delta 2 4 NA NA 3 5 0.5 0.3 1 8
a = c(2,3,1,9)
b = c(4,5,8,1)
sentiment = cbind(a,b) %>%
as.data.frame()`
Outcome should be:
a b a_delta b_delta
2 4 NA NA
3 5 0.5 0.3
1 8 -0.7 0.6
9 1 8.0 -0.8
在我目前的方法中,我使用两个步骤:(1)创建每周滞后,(2)计算滞后值和值之间的百分比差异。没有错误消息,但计算仍然不正确,我不确定原因。任何帮助都将不胜感激
library(data.table)
a = c(2,2.5,2,4)
b = c(4,5,8,1)
sentiment = cbind(a,b) %>%
as.data.frame()
setDT(sentiment)[, paste0(names(sentiment), "_delta") := lapply(.SD, function(x) shift(x, 1L,
type="lag")/x -1)]
我们可以使用
diff
library(dplyr)
sentiment %>%
mutate_all(list(delta = ~ round(c(NA, diff(.))/lag(.), 1)))
或者如果我们使用dplyr的devel
版本
sentiment %>%
mutate(across(everything(), ~ round(c(NA, diff(.x))/lag(.x), 1),
names = "{col}_delta"))
# a b a_delta b_delta
#1 2 4 NA NA
#2 3 5 0.5 0.2
#3 1 8 -0.7 0.6
#4 9 1 8.0 -0.9
下面是一个基本的R解决方案,使用sapply
将函数传递到lappy
,该函数使用setNames
使用所需的输出列名对情绪列进行迭代
sentiment <- data.frame(a = c(2,3,1,9), b = c(4,5,8,1))
calc_lag <- function(x) {
c(NA, round(sapply(2:length(x), function(y) {
(x[y] - x[y-1]) / x[y-1]
}), 1))
}
cbind(sentiment, lapply(setNames(sentiment, paste0(colnames(sentiment), '_lag')), calc_lag))
# a b a_lag b_lag
#1 2 4 NA NA
#2 3 5 0.5 0.2
#3 1 8 -0.7 0.6
#4 9 1 8.0 -0.9
情绪我想你的意思是“x/shift(x,1L,type=“lag)-1”,而不是相反