对多个data.frames执行一个循环,以接收一个表,其中包含来自data.frames的值

ev7lccsx  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(83)

我需要为多个data. frames循环整个代码。这是现在的CEPSird 2,但我也需要它为CEPSird 1,CEPSird 3,.和其他人(见下文有一个数据的输出)
我想要的是:我有一个数据框(即CEPSird 2),我对“ird 2”栏感兴趣(其他数据的列.frames是相等的,并且具有从2015年到2022年的多年值,但我只需要>2018年的值)。在第一个循环中,我创建了一个新的数据框架(ÄnderungAbsolut)两年内的绝对差值(“19/20”,“20/21”,“21/22”)。然后我将这3列中的每一列拆分为只有正值和负值,并接收6个向量(positive 20,positive 21,negative 20,....),每年两个。然后我想为这6个向量中的每一个计算不同的数字(平均值、标准差、基尼系数和一个函数(x)),并将它们总结在一个表格(结果)中。(“19/20”,“20/21”,“21/22”)和我感兴趣的8个数字。现在我需要这个相同的表,只是不为CEPSird 2中的ird 2,而是为CEPSird 1中的ird 1和CEPSird 3中的ird 3等。如果行前面有年份而不是1,2,3喜欢它是现在,也是他们从哪里来(ird 2秩序ird 3等)
我知道这是很多,但也许有人可以帮助我。非常感谢。

Test <- data.frame(year= rep(c(2018,2019,2020,2021,2022),6),
          id_zewo= rep(c(1:6),each=5),
          ird2=runif(30, min = 10000, max = 30000))

Test.id_zewo <- as.numeric(Test[Test$year==2019, c("id_zewo")])

result <- c()
for (i in Test.id_zewo) {
  value <- Test %>%
    filter(id_zewo %in% i, year > 2018) %>%
    select(3)
  Wert1 <- value$ird2[2]-value$ird2[1]
  Wert2 <- value$ird2[3]-value$ird2[2]
  Wert3 <- value$ird2[4]-value$ird2[3]
  result <- rbind(result, c(i,Wert1,Wert2,Wert3))
}
ÄnderungAbsolut <- as_tibble(result)
colnames(ÄnderungAbsolut) <- c("id_zewo","19/20","20/21","21/22")

positive20 <- ÄnderungAbsolut[ÄnderungAbsolut$`19/20`>0, ]
positive20 <- positive20[order(positive20$`19/20`, decreasing = TRUE), c("id_zewo","19/20")]

positive21 <- ÄnderungAbsolut[ÄnderungAbsolut$`20/21`>0, ]
positive21 <- positive21[order(positive21$`20/21`, decreasing = TRUE), c("id_zewo","20/21")]

positive22 <- ÄnderungAbsolut[ÄnderungAbsolut$`21/22`>0, ]
positive22 <- positive22[order(positive22$`21/22`, decreasing = TRUE), c("id_zewo","21/22")]

negative20 <- ÄnderungAbsolut[ÄnderungAbsolut$`19/20`<0, ]
negative20 <- negative20[order(negative20$`19/20`), c("id_zewo","19/20")]

negative21 <- ÄnderungAbsolut[ÄnderungAbsolut$`20/21`<0, ]
negative21 <- negative21[order(negative21$`20/21`), c("id_zewo","20/21")]

negative22 <- ÄnderungAbsolut[ÄnderungAbsolut$`21/22`<0, ]
negative22 <- negative22[order(negative22$`21/22`), c("id_zewo","21/22")]

df_listpos <- list(positive20,positive21,positive22)
df_listneg <- list(negative20,negative21,negative22)
  extracted_pos <- lapply(df_listpos, purrr::pluck, 2)
  extracted_neg <- lapply(df_listneg, purrr::pluck, 2)
  
mean_pos <- lapply(extracted_pos, mean) |> unlist()
mean_neg <- lapply(extracted_neg, mean) |> unlist()
  sd_pos <- lapply(extracted_pos, sd) |> unlist()
  sd_neg <- lapply(extracted_neg, sd) |> unlist()
    gini_pos <- lapply(extracted_pos, Gini) |> unlist()
    gini_neg <- lapply(extracted_neg, Gini) |> unlist()
      cumsum_pos <- lapply(extracted_pos, function(x) sum(cumsum(x)/sum(x)<0.75)) |> unlist()
      cumsum_neg <- lapply(extracted_neg, function(x) sum(cumsum(x)/sum(x)<0.75)) |> unlist()
results <- data.frame(id = 1:length(extracted_pos), mean_pos, mean_neg, sd_pos, sd_neg, 
                      gini_pos,gini_neg, cumsum_pos,cumsum_neg)

字符串
这里是我的数据的尾部。年份范围从2015年到2022年,id_zewo只是行中值的对应数字。我过滤掉ird 2,因为CEPSird 2,CEPSird 3,.(“year”,“id_zewo”,“ird 2”)我需要这样我就可以跳过这一步。ÄnderungAbsolut data.frame给我例如id_zewo 500在19/20,20/21和21/22之间的差异。

tail(CEPSird2[c("year","id_zewo","ird2","ird3")])
     year id_zewo    ird2    ird3
3859 2022     500  129302  802312
3861 2022     502 4399508 4658553
3867 2022     514  871262       0
3869 2022     518   86635       0
3871 2022     521  128275       0
3872 2022     522       0       0

xhv8bpkk

xhv8bpkk1#

一种通用的方法,将相同的操作应用于一系列嵌套框并将结果合并。d1d2是您的嵌套框:

library(dplyr)

    d1 <- data.frame(year = 2018, value = rnorm(3), dummy_a = 'junk')
    d2 <- data.frame(year = 2019, value = rnorm(3), dummy_b = 'other junk')
    
    list(d1, d2) %>%
      Map(f = \(d){## some data processing, e. g.: tidyverse stuff
        d %>%
          select(year, value) %>%
          mutate(value = value * pi)
      }) %>%
      do.call(rbind, .)

字符串
输出:

##   year      value
    ## 1 2018  3.2673407
    ## 2 2018 -1.0875516
    ## 3 2018  0.2297448
    ## 4 2019 -1.6449955
    ## 5 2019 -0.4552625
    ## 6 2019 -3.8103155

5q4ezhmt

5q4ezhmt2#

我将您的计算重写为dplyr代码。由于其group_by功能,避免了许多for循环。简而言之,这使我们能够为例如每个year或每个id计算单独的汇总统计数据。这使我们能够跳过许多小型中间 Dataframe 的繁琐创建。
这是完整的代码。所有的计算都包含在data_wrangling部分。请参阅下面的代码分解。需要将这些计算应用于许多 Dataframe 。

library(dplyr)

# create example data frames
test1 <- data.frame(year = rep(c(2018:2022), 6),
                    id_zewo = rep(c(1:6),each = 5),
                    ird1 = runif(30, min = 10000, max = 30000))

test2 <- data.frame(year = rep(c(2018:2022), 6),
                    id_zewo = rep(c(1:6), each = 5),
                    ird2 = runif(30, min = 100, max = 1000))

test3 <- data.frame(year = rep(c(2018:2022),6),
                    id_zewo = rep(c(1:6), each = 5),
                    ird3 = runif(30, min = 1, max = 100))

# create a list containing these data frames
df_list <- list(test1, test2, test3)

# one way to save some hassle is to rename 
# all `ird1, 2, 3... ` columns to "value".

# get old colnames
new_colnames <- names(test1)
# inject colname "value" instead of "ird..."
new_colnames[3] <- "value"

# apply column renaming to all data frames
df_list <- lapply(df_list, setNames, new_colnames)

# data wrangling starts
# defining a function that does all the work
# to be called later inside `lapply()`

data_wrangling <- function(x){
  x |>
  group_by(id_zewo) |>
  filter(year > 2018) |>
  mutate(year_diff = value - dplyr::lag(value)) |>
  ungroup() |>
  mutate(positive_diff = year_diff > 0) |> # This is a helper, allowing us to use group by
  group_by(positive_diff, year) |>
  summarise(mean = mean(year_diff),
            sd = sd(year_diff),
            n_below_3rd_quartile = sum(cumsum(year_diff) / sum(year_diff) < 0.75))
  #gini = Gini(year_diff)) # I dont know what package Gini is from
}

# apply data wrangling steps to all data frames
results <- lapply(df_list, data_wrangling)

# show results
results

字符串

结果

每个输入数据框包含一个结果表的列表。

# [[1]]
# # A tibble: 7 × 5
# # Groups:   positive_diff [3]
# positive_diff  year   mean    sd n_below_3rd_quartile
# <lgl>         <int>  <dbl> <dbl>                <int>
#   1 FALSE          2020 -9098. 5046.                    2
# 2 FALSE          2021 -5562. 3180.                    3
# 3 FALSE          2022 -6050. 4858.                    2
# 4 TRUE           2020  7869. 4573.                    2
# 5 TRUE           2021  1950. 1915.                    0
# 6 TRUE           2022  6578. 6156.                    1
# 7 NA             2019    NA    NA                    NA
# 
# [[2]]
# # A tibble: 7 × 5
# # Groups:   positive_diff [3]
# positive_diff  year   mean    sd n_below_3rd_quartile
# <lgl>         <int>  <dbl> <dbl>                <int>
#   1 FALSE          2020 -150.  157.                     1
# 2 FALSE          2021 -348.  297.                     2
# 3 FALSE          2022  -36.5  NA                      0
# 4 TRUE           2020  596.  194.                     2
# 5 TRUE           2021  246.   40.5                    1
# 6 TRUE           2022  234.  145.                     3
# 7 NA             2019   NA    NA                     NA
# 
# [[3]]
# # A tibble: 7 × 5
# # Groups:   positive_diff [3]
# positive_diff  year   mean    sd n_below_3rd_quartile
# <lgl>         <int>  <dbl> <dbl>                <int>
#   1 FALSE          2020  -9.30  5.64                    1
# 2 FALSE          2021 -18.5  15.2                     2
# 3 FALSE          2022 -50.4  15.1                     3
# 4 TRUE           2020  21.0  29.8                     0
# 5 TRUE           2021  13.5  12.6                     2
# 6 TRUE           2022  47.1   9.07                    1
# 7 NA             2019  NA    NA                      NA

数据争用部分

让我们看看在我们的自定义数据处理函数中做了什么。让我们以test1作为示例数据。

test1 |>
  group_by(id_zewo) |>
  filter(year > 2018) |>
  mutate(year_diff = ird1 - dplyr::lag(ird1)) |>
  ungroup() |>
  mutate(positive_diff = year_diff > 0) |> # This is a helper, allowing us to use group by
  group_by(positive_diff, year) |>
  summarise(mean = mean(year_diff),
            sd = sd(year_diff),
            n_below_3rd_quartile = sum(cumsum(year_diff) / sum(year_diff) < 0.75))
#gini = Gini(year_diff)) # I dont know what package Gini is from


这里是一个逐步总结。

  1. group_by(id_zewo)按ID对数据进行分组。这确保了稍后为每个ID单独计算diff(您在代码开始时尝试使用for循环实现)。
    1.过滤数据以排除2019年以下的年份
    1.创建一个列diff,其中包含与上一年ird的差异。因为我们按id分组,所以此差异是为每个id_zewo单独计算的。
    下面是该表在此步骤中的外观:
test1 |>
  group_by(id_zewo) |>
  filter(year > 2018) |>
  mutate(year_diff = ird1 - dplyr::lag(ird1))

# Output:
# A tibble: 24 × 4
# Groups:   id_zewo [6]
# year id_zewo   ird1 year_diff
# <int>   <int>  <dbl>     <dbl>
# 2019       1 23248.       NA 
# 2020       1 19966.    -3282.
# 2021       1 23271.     3304.
# 2022       1 21833.    -1437.
# 2019       2 28372.       NA 
# 2020       2 16062.   -12310.
# 2021       2 10383.    -5678.
# 2022       2 23761.    13378.
# 2019       3 19182.       NA 
# 2020       3 27070.     7887.


请注意,我们的分组是有效的,因为在每个id组中,year 2019的差异从NA开始,因为2019年之前没有年份。
1.删除分组
我们这样做是因为下面的汇总统计量应该由year而不是id计算。我们想要2019年的mean,2020年等。但首先我们需要创建一个助手列。
1.创建一个helper列,指示diff year_diff是否为正。
1.按此辅助列positive_diffyear分组,因此我们在接下来的步骤中分别获得每个单独年份的正差和负差的汇总统计数据。
1.计算汇总统计数据。你可以修改代码来包含我没有找到的Gini函数。

数据整理输出适用于test1

# # A tibble: 7 × 5
# # Groups:   positive_diff [3]
# positive_diff  year   mean    sd n_below_3rd_quartile
# <lgl>         <int>  <dbl> <dbl>                <int>
# 1 FALSE          2020 -9098. 5046.                    2
# 2 FALSE          2021 -5562. 3180.                    3
# 3 FALSE          2022 -6050. 4858.                    2
# 4 TRUE           2020  7869. 4573.                    2
# 5 TRUE           2021  1950. 1915.                    0
# 6 TRUE           2022  6578. 6156.                    1
# 7 NA             2019    NA    NA                    NA


如何阅读此输出:

  • 正差异的汇总统计信息位于列positive_diff中有TRUE的行中
  • 负差的统计数据位于positive_diffFALSE的行中。
  • 最后一行NA可以忽略。这是因为group_by(positive_diff)认为NA是一个组。

相关问题