цикл читать листы и добавить листы как еще один столбец в R - PullRequest
0 голосов
/ 04 декабря 2018

Итак, у меня есть несколько листов в одном файле Excel (например, таблицы листов: s1, s2, s3).Я хочу создать функцию, чтобы читать их и прикреплять к каждой вкладке листов другой столбец с их повторяющимся именем вкладки, а затем объединять их вместе в виде фрейма данных.

##### Шаг 1 читать на нескольких вкладках листов вfunction
s1<-data.frame(ID=c(132,453,644)) 
s2<-data.frame(ID=c(1332,4532,6443)) 
s3<-data.frame(ID=c(432,643,747))

> s1
   ID
1 132
2 453
3 644
> s2
    ID
1 1332
2 4532
3 6443
> s3
   ID
1 432
2 643
3 747 
###### Результат Шаг 2
s1$tabname<-c(rep('s1',nrow(s1)))
> s1
   ID tabname
1 132      s1
2 453      s1
3 644      s1
s2$tabname<-c(rep('s2',nrow(s2)))
> s2
    ID tabname
1 1332      s2
2 4532      s2
3 6443      s2
s3$tabname<-c(rep('s3',nrow(s3)))
> s3
   ID tabname
1 432      s3
2 643      s3
3 747      s3
#### Моя конечная цель
ultimate<-rbind(s1,s2,s3)
> ultimate
    ID tabname
1  132      s1
2  453      s1
3  644      s1
4 1332      s2
5 4532      s2
6 6443      s2
7  432      s3
8  643      s3
9  747      s3
#### Я застрял на шаге 2, чтобы добавить col в соответствии с именами их вкладок, и пришлось трудноШаг 3 кода также.Мои коды, как показано ниже, может кто-нибудь дать мне подсказку?#
library("readxl")
Import<-function(Ref){

  Excel.Ref<-read_xlsx("The Excel Sheet I Have.xlsx", sheet = Ref)

  for (Ref in 1:length(Ref)){
    Excel.Ref<-cbind(Excel.Ref, 

                     Excel.Tab<- data.frame (Tab_name =rep(Ref,nrow(Excel.Ref))))
  }
  return(Excel.Ref)
  print(Ref)
}
d<-c('s1','s2','s3')

Obs<-apply(d<-as.matrix(d), 1, function(x)do.call(Import, as.list(x)))

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вот простое решение dplyr:

Import <- function(xlsxfile,col_names){
  # get names of sheets in input xlsxfile
  sheets <- readxl::excel_sheets(xlsxfile)
  # sheets as list
  l <- lapply(sheets, readxl::read_xlsx, path=xlsxfile, col_names=col_names)
  # sheets as data.frame
  dplyr::bind_rows(l,.id="tabname")  
}

Import(xlsxfile,col_names="ID")

# A tibble: 9 x 2
  tabname    ID
  <chr>   <dbl>
 2 1       132  
 3 1       453  
 4 1       644  
 6 2       1332 
 7 2       4532 
 8 2       6443  
10 3       432  
11 3       643  
12 3       747 

Используйте col_names аргумент read_xlsx(), чтобы указать имя столбца с именами вкладок.

Использовать bind_rows() для связывания списка data.frames в один data.frame, отслеживая источник data.frame в новом столбце, имя которого задается аргументом .id.

0 голосов
/ 04 декабря 2018

Я добился желаемого результата, используя комбинацию readxl и tidyverse.Я создал файл в моей среде с именем test_file с листами.

##First: get all sheet names
sheets_to_read <- readxl::excel_sheets("test_file.xlsx")

##Second: read all sheets, add tabname, and then bind rows
x <- bind_rows(lapply(1:length(sheets_to_read),
            function(i)readxl::read_excel("test_file.xlsx",
                       sheet = sheets_to_read[i]) %>%
                       mutate(tabname = sheets_to_read[i])))

x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...