У меня есть data.frame, созданный из других функций, которые берут список файлов .xlsx и читают все рабочие книги и включенные листы.
В результате получается хороший фрейм данных как таковой:
df<-data.frame(
file.name <-c(“C:/R/Folder1/WB1.xlsx”,
“C:/R/Folder1/WB2.xlsx,”,”C:/R/Folder1/WB2.xlsx”, “C:/R/Folder2/WB1.xlsx”, “C:/R/Folder2/WB1.xls”),
data<-list(df1,df2,df3,df4,df5))
Несмотря на то, что я могу получить (удалить) фреймы данных, я теряю соответствующее местоположение файла, которое мне нужно.
Есть ли способ сохранить соответствующую строку из фрейма данных и вставить () какстолбец при отмене?
* Извините за опечатки.Опубликовано в SO app.
Обновление (теперь, когда я нахожусь перед ПК)
Воспроизводимый пример:
данные:
df1<-data.frame(V1=c(sample(900:970,6)),
V2=c(sample(LETTERS[1:6],6)))
df2<-data.frame(V1=sample(750:780,6),
V2=sample(LETTERS[8:16],6))
df3<-data.frame(V1=sample(200:250,6),
V2=sample(LETTERS[10:20],6),
V3=sample(2300:5821,6))
df4<-data.frame(V1=sample(396:480,6),
V2=sample(LETTERS,6))
df5<-data.frame(V1=sample(50:100,6),
V2=sample(LETTERS,6))
df6<-data.frame(V1=sample(200:250,6),
V2=sample(LETTERS,6),
V3=sample(letters,6))
my.list <- list(df1,df2,df3,df4,df5,df6)
mydf<-data.frame(
files=c("C:/Folder1/Data/File1.xlsx","C:/Folder1/Data/File2.xlsx",
"C:/Folder1/Data/File3.xlsx","C:/Folder2/Data/File1.xlsx",
"C:/Folder2/Data/File2.xlsx","C:/Folder2/Data/File3.xlsx"))
mydf$data<-my.list
При попытке развернуть - я столкнулся с следующей проблемой (из-за различий в наблюдениях и переменных в списке data.frames (столбец 2):
y<-unnest(mydf, data)
Error: Column `V3` can't be converted from integer to factor
In addition: Warning messages:
1: In bind_rows_(x, .id) : Unequal factor levels: coercing to character
2: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector
3: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector...
Результаты других функций
#tidyverse
y<-mydf %>% unnest(data)
Error: Column `V3` can't be converted from integer to factor
In addition: Warning messages:
1: In bind_rows_(x, .id) : Unequal factor levels: coercing to character
y<-mydf %>%
+ unnest(data) %>%
+ group_by(files) %>%
+ mutate(
+ data = flatten_chr(data),
+ data_colname = str_c("data_", row_number())
+ ) %>% # or just as.character
+ spread(data_colname, data)
Error: Column `V3` can't be converted from integer to factor
In addition: Warning messages:
1: In bind_rows_(x, .id) : Unequal factor levels: coercing to character
Добавление используемой функции для извлечения .xlsx и всех листов - как показано в этом примере :
library(tidyverse)
library(readxl)
dir_path1 <- "~/File1/Data/Qtr1"
dir_path2 <- "~/File1/Data/Qtr2"
dir_path3 <- "~/File1/Data/Qtr3"
dir_path4 <- "~/File1/Data/Qtr4"
re_file <- ".xlsx"
read_sheets <- function(dir_path1, file){
xlsx_file <- paste0(dir_path1, file)
xlsx_file %>%
excel_sheets() %>%
set_names() %>%
map_df(read_excel, path = xlsx_file, .id = 'sheet_name') %>%
mutate(file_name = file) %>%
select(file_name, sheet_name, everything())
}
df <- list.files(dir_path, re_file) %>%
map_df(~ read_sheets(dir_path, .))
Возвращает:
# A tibble: 15 x 5
file_name sheet_name col1
<chr> <chr> <dbl>
1 Q1_File1.xlsx Sheet1 1
2 Q1_File1.xlsx Sheet2 1
3 Q1_File2.xlsx Sheet1 1
...
Однако, в отличие от данных примера (как показано в ссылке), возвращаемые данные (col1) представляют собой списоккадров данных.