как экспортировать фреймы данных из R в Excel и разделить их пустой строкой

#r #excel #append #export

#r #excel #добавить #экспорт

Вопрос:

Я должен добавить фреймы данных, хранящиеся в разных списках в R, и разделить их пустой строкой (в файле Excel).

Я не могу связать фреймы данных из разных списков в один, потому что у них разное количество столбцов.

Я также не могу использовать пакеты ‘xlsx’ и ‘XLConnect’, потому что они вызывают у меня проблемы, связанные с Java.

Любая помощь приветствуется.

Первый список фреймов данных:

 listofdfs <- list(x <- data.frame("y"=c(2009,2010,2011),"b"=c(35,30,20)), y <- data.frame("y"=c(2009,2010,2011), "b"=c(6,21,40)) )

label <- c("Red","Green")

listofdfs <- setNames(listofdfs, label)

$Red
     y  b
1 2009 35
2 2010 30
3 2011 20

$Green
     y  b
1 2009  6
2 2010 21
3 2011 40
  

второй список фреймов данных (с большим количеством столбцов, чем предыдущие):

 listofdfs_2 <- list(x <- data.frame("y"=c(2009,2010,2011),"x_1"=c(35,30,20), "x_2"=c(1,2,0), "x_3"=c(6,0,3), "x_4"=c(12,5,8)), y <- data.frame("y"=c(2009,2010,2011), "x_1"=c(6,21,40), "x_2"=c(3,5,0), "x_3"=c(6,9,12), "x_4"=c(8,5,1)) )

label <- c("Red","Green")

listofdfs_2 <- setNames(listofdfs_2, label)

$Red
     y x_1 x_2 x_3 x_4
1 2009  35   1   6  12
2 2010  30   2   0   5
3 2011  20   0   3   8

$Green
     y x_1 x_2 x_3 x_4
1 2009   6   3   6   8
2 2010  21   5   9   5
3 2011  40   0  12   1
  

Я хотел бы получить на одном листе Excel таблицы таким образом:

введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

Используя openxlsx , который, я надеюсь, работает для вас лучше, чем другие упомянутые вами пакеты, вы можете сделать:

 library(openxlsx)

# create your workbook
mywb <- createWorkbook() 

# create the sheets you need based on the first list of tables
for (sheetName in names(listofdfs)){
    addWorksheet(mywb , sheetName )
}

# get all your lists of tables in a single list
l_listOfDF <- mget(ls(pattern="listofdf"))

# initiate the index of the row where you will want to start writing (one per sheet)
startR <- rep(1, length(listofdfs)) ; names(startR) <- names(listofdfs)

# loop over the lists of tables using index and then over the elements / sheets using their names
for(N_myListOfDF in seq(l_listOfDF)){

  for(pageName in names(l_listOfDF[[N_myListOfDF]])){

    # write the name/number of your table in the correct sheet, at the correct row
    writeData(mywb, sheet=pageName, startRow=startR[pageName], paste0("Table ", N_myListOfDF, "."))

    # write your data in the correct sheet at the correct row (the one after the name)
    writeData(mywb, sheet=pageName, startRow=startR[pageName] 1, l_listOfDF[[N_myListOfDF]][[pageName]])
    
    # update the row number (the   3 is to leave space for name of table, headers and blank row
    startR[pageName] <- startR[pageName] nrow(l_listOfDF[[N_myListOfDF]][[pageName]])   3

  }
}

# save your workbook in a file
saveWorkbook(mywb , "myfile.xlsx")
  

Выходной файл:
введите описание изображения здесь

Ответ №2:

Одна проблема за раз:

1. Добавление фреймов данных с разными столбцами

 rbind(df1,df2) #this fails if they do not have the same columns

library(dplyr)
df1 %>%
    bind_rows(df2) #this works even with different columns

#including an empty row
df1 %>%
    bind_rows(df_empty) %>% #pre-create a df with one "check" column and an empty row
    bind_rows(df2)
  

2. Запись в Excel

Если вы пробовали разные пакеты, подобные foreign этому, просто сохраните как csv файл, который можно открыть в Excel.

 write.csv(df_result,"result.csv")
  

Комментарии:

1. Мне нужно добавить наборы данных из разных списков по столбцам, а не по строкам

2. Это не соответствует описанию в вашем вопросе. Если вы cbind() , разные столбцы не имеют значения, только разное количество строк. Кроме того, нет способа добавить пустые «строки» между добавленными столбцами. Можете ли вы расширить описание своей проблемы примером ввода и вывода?

3. Я отредактировал свой вопрос с примерами ввода и вывода.

4. Есть идеи для возможного решения?