【问题标题】:How to lag and calculate difference for every data frame in a list?如何滞后和计算列表中每个数据框的差异?
【发布时间】:2019-11-04 02:19:09
【问题描述】:

我有一个包含 981 个数据框的列表。每个 data.frame 具有相同的结构。

我想滞后一列(称为增长)来计算每个数据帧随时间的增长(从一个观察到另一个观察)。

我尝试了 lapply,但不知何故无法完成。

my_list <- 
  list(
    data.frame(time = 1:10, growth = rnorm(10, mean = 1.3, sd = 2)),
    data.frame(time = 1:10, growth = rnorm(10, mean = 1.3, sd = 2)),
    data.frame(time = 1:10, growth = rnorm(10, mean = 1.3, sd = 2))
  )

【问题讨论】:

  • 我们能否看一个可重现的例子,请您的lapply 尝试和预期结果?

标签: r list dataframe lapply lag


【解决方案1】:

如果您无法共享真实数据,您可以创建一个假数据集以使帖子可重现。

如果我对您的理解正确,那么您可以使用lapply 做些什么

lapply(list_df, function(x) {x$difference <- c(NA, diff(x$growth)); x})

#[[1]]
#   growth b difference
#1       3 a         NA
#2       8 b          5
#3       4 c         -4
#4       7 d          3
#5       6 e         -1
#6       1 f         -5
#7      10 g          9
#8       9 h         -1
#9       2 i         -7
#10      5 j          3

#[[2]]
#   growth b difference
#1      10 a         NA
#2       5 b         -5
#3       6 c          1
#4       9 d          3
#5       1 e         -8
#6       7 f          6
#7       8 g          1
#8       4 h         -4
#9       3 i         -1
#10      2 j         -1

tidyverse 的做法是

library(dplyr)
library(purrr)

map(list_df,. %>% mutate(difference = c(NA, diff(growth))))

map(list_df,. %>% mutate(difference = growth - lag(growth)))

数据

set.seed(123)
list_df <- list(data.frame(growth = sample(10), b = letters[1:10]), 
               data.frame(growth = sample(10), b = letters[1:10]))

【讨论】:

  • 谢谢,这正是我所需要的!下次我会记住添加一个可重现的示例。
【解决方案2】:

我们可以在base R 中使用lapplytransform

lapply(list_df, transform, difference = c(NA, diff(growth)))
#[[1]]
#   growth b difference
#1       3 a         NA
#2      10 b          7
#3       2 c         -8
#4       8 d          6
#5       6 e         -2
#6       9 f          3
#7       1 g         -8
#8       7 h          6
#9       5 i         -2
#10      4 j         -1

#[[2]]
#   growth b difference
#1      10 a         NA
#2       5 b         -5
#3       3 c         -2
#4       8 d          5
#5       1 e         -7
#6       4 f          3
#7       6 g          2
#8       9 h          3
#9       7 i         -2
#10      2 j         -5

数据

set.seed(123)
list_df <- list(data.frame(growth = sample(10), b = letters[1:10]), 
               data.frame(growth = sample(10), b = letters[1:10]))

【讨论】:

    猜你喜欢
    • 2019-04-26
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多