【问题标题】:Calculating percentage change over row values while iterating through columns using lapply in R在使用 R 中的 lapply 遍历列时计算行值的百分比变化
【发布时间】:2020-06-08 09:15:53
【问题描述】:

我有一个数据框,其中包含大量变量的每周值。我想遍历每一列并获得每行的每周变化和以百分比表示的变量。

例子:

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)]

【问题讨论】:

  • 我认为你的意思是 ` x / shift(x, 1L, type = "lag) -1 ` 而不是相反

标签: r loops data.table iteration lapply


【解决方案1】:

这是一个基本 R 解决方案,使用 sapply 传递给 lapply 的函数,该函数使用 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

【讨论】:

    【解决方案2】:

    我们可以使用diff

    library(dplyr)
    sentiment %>%
          mutate_all(list(delta = ~ round(c(NA, diff(.))/lag(.), 1)))
    

    或者如果我们使用devel 版本的dplyr

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 2021-11-30
      • 2015-09-29
      • 1970-01-01
      相关资源
      最近更新 更多