我需要为多个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
型
2条答案
按热度按时间xhv8bpkk1#
一种通用的方法,将相同的操作应用于一系列嵌套框并将结果合并。
d1
和d2
是您的嵌套框:字符串
输出:
型
5q4ezhmt2#
我将您的计算重写为
dplyr
代码。由于其group_by
功能,避免了许多for
循环。简而言之,这使我们能够为例如每个year
或每个id
计算单独的汇总统计数据。这使我们能够跳过许多小型中间 Dataframe 的繁琐创建。这是完整的代码。所有的计算都包含在
data_wrangling
部分。请参阅下面的代码分解。需要将这些计算应用于许多 Dataframe 。字符串
结果
每个输入数据框包含一个结果表的列表。
型
数据争用部分
让我们看看在我们的自定义数据处理函数中做了什么。让我们以
test1
作为示例数据。型
这里是一个逐步总结。
group_by(id_zewo)
按ID对数据进行分组。这确保了稍后为每个ID单独计算diff
(您在代码开始时尝试使用for
循环实现)。1.过滤数据以排除2019年以下的年份
1.创建一个列
diff
,其中包含与上一年ird
的差异。因为我们按id
分组,所以此差异是为每个id_zewo
单独计算的。下面是该表在此步骤中的外观:
型
请注意,我们的分组是有效的,因为在每个
id
组中,year
2019的差异从NA
开始,因为2019年之前没有年份。1.删除分组
我们这样做是因为下面的汇总统计量应该由
year
而不是id
计算。我们想要2019年的mean
,2020年等。但首先我们需要创建一个助手列。1.创建一个helper列,指示diff
year_diff
是否为正。1.按此辅助列
positive_diff
和year
分组,因此我们在接下来的步骤中分别获得每个单独年份和的正差和负差的汇总统计数据。1.计算汇总统计数据。你可以修改代码来包含我没有找到的
Gini
函数。数据整理输出适用于
test1
型
如何阅读此输出:
positive_diff
中有TRUE
的行中positive_diff
为FALSE
的行中。NA
可以忽略。这是因为group_by(positive_diff)
认为NA
是一个组。