【发布时间】:2019-12-03 14:59:47
【问题描述】:
我正在尝试从许多格式不整齐的 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?
我最终想要的是一个单一的数据框,将所有数据以整齐的格式集中在一个地方。
对不起,如果我在这里遗漏了一些简单的东西。我觉得有很多这样的结构数据,清理它的解决方案应该相当简单。我似乎无法想到它。
【问题讨论】: