gpt4 book ai didi

r - lapply over lapply(或其他清理时间序列数据的方式)

转载 作者:行者123 更新时间:2023-12-04 10:56:17 26 4
gpt4 key购买 nike

我正在尝试从许多格式不整洁的 excel 电子表格中提取一些数据。我想我需要在 lapply 内运行 lapply,但似乎无法使其工作。这是一个例子:

这是两个数据框,其格式与我在 excel 表中找到的格式相同:

library('dplyr')
library('tidyr')
library('readxl')

df1 <- data.frame(instance = c('...', 'A', 'B'),
`1990.1` = c('est', 1, 2),
`1990.2` = c('val', 2, 3),
`1991.1` = c('est', 3, 4),
`1991.2` = c('val', 4, 5))


df2 <- data.frame(instance = c('...', 'A', 'B'),
`1990.1` = c('est', 5, 6),
`1990.2` = c('val', 6, 7),
`1991.1` = c('est', 7, 8),
`1991.2` = c('val', 8, 9))
> df1
instance X1990.1 X1990.2 X1991.1 X1991.2
1 ... est val est val
2 A 1 2 3 4
3 B 2 3 4 5

我创建了一个函数来清理基于以下的数据:
df1 %>%  
select(1, which(.[1,] == 'est')) %>%
.[-1,] %>%
gather(key = year, value = score, -instance) %>%
mutate(var = 'est')

instance year score var
1 A X1990.1 1 est
2 B X1990.1 2 est
3 A X1991.1 3 est
4 B X1991.1 4 est

给出:
data_clean <- function(x) {
df1 %>%
select(1, which(.[1,] == x)) %>%
.[-1,] %>%
gather(key = year, value = score, -instance) %>%
mutate(var = x)
}

我现在可以生成每个 df 的干净版本,如下所示:
do.call(rbind, lapply(c('est', 'val'), data_clean)) %>% 
mutate(origin = 'df1')

instance year score var origin
1 A X1990.1 1 est df1
2 B X1990.1 2 est df1
3 A X1991.1 3 est df1
4 B X1991.1 4 est df1
5 A X1990.2 2 val df1
6 B X1990.2 3 val df1
7 A X1991.2 4 val df1
8 B X1991.2 5 val df1

我现在需要做的是将其应用于数据框列表:
list_data <- list(df1, df2)

在我的情况下,我会从一个函数生成这个:
data_pull <- function(x) {
read_excel('path/to/file', sheet = x)
}

list_data <- lapply(2:20, data_pull)

但我想不出该怎么做。我需要将 data_clean 应用于 data_pull 生成的列表的每个元素。我显然需要删除 data_clean 函数中对 df 的第一次调用,但是我将什么对象传递给 data_clean?

我最终想要的是一个单一的数据框,所有数据都在一个地方,格式整齐。

抱歉,如果我在这里遗漏了一些简单的东西。我觉得有很多这样的结构数据,清理它的解决方案应该相当简单。我似乎想不出。

最佳答案

一种选择是将其保存在 list 中。并使用 map 遍历列表.我们可以通过 paste 重命名列为除“实例”之外的所有列设置第一行,slice第一行,使用 pivot_longer从“宽” reshape 为“长”,separate 'name' 列一分为二,并将 type如果需要的话。

library(dplyr)
library(tidyr)
library(purrr)
library(readr)
library(stringr)
f1 <- function(dat) {
names(dat)[-1] <- str_c(names(dat)[-1], unlist(dat[1,-1]), sep="_")
dat %>%
slice(-1) %>%
pivot_longer(cols = -instance, values_to = "seq" ) %>%
mutate_all(as.character) %>%
separate(name, into = c('year', 'var'), sep="_", convert = TRUE) %>%
type_convert()

}




map_dfr(set_names(list_data, c('df1', 'df2')), f1, .id = 'origin')
# A tibble: 16 x 5
# origin instance year var seq
# <chr> <chr> <chr> <chr> <dbl>
# 1 df1 A X1990.1 est 1
# 2 df1 A X1990.2 val 2
# 3 df1 A X1991.1 est 3
# 4 df1 A X1991.2 val 4
# 5 df1 B X1990.1 est 2
# 6 df1 B X1990.2 val 3
# 7 df1 B X1991.1 est 4
# 8 df1 B X1991.2 val 5
# 9 df2 A X1990.1 est 5
#10 df2 A X1990.2 val 6
#11 df2 A X1991.1 est 7
#12 df2 A X1991.2 val 8
#13 df2 B X1990.1 est 6
#14 df2 B X1990.2 val 7
#15 df2 B X1991.1 est 8
#16 df2 B X1991.2 val 9

如果我们使用函数 data_pull
map_dfr(2:20, ~ data_pull(.x) %>%
f1, .id = 'origin')

关于r - lapply over lapply(或其他清理时间序列数据的方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59159908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com