Проблемы с манипулированием файлами в списке - PullRequest
0 голосов
/ 19 апреля 2019

Я импортировал 90 файлов Excel, создав каталог (dir) и использовав (lapply). Я не уверен, называется ли это вложенным списком или нет. После импорта файлов Excel в список, я вижу, что некоторые файлы имеют четыре столбца, а некоторые другие имеют пять столбцов. Мои вопросы:

  1. Как я могу вырезать файлы с четырьмя столбцами из этого списка и вставить его в новый список.
  2. Как я могу затем объединить все похожие файлы столбцов в списке в один файл.
  3. Как я могу сохранить эти два файла как два разных листа Excel?
library(foreign)
setwd("F:\\Spring 2019\\Thesis_data\\Kam_Thesis\\data\\nontidal_water_level")

nontidal_list <- dir(pattern= ".xlsx")

nontidal_water_level <- lapply(nontidal_list, read_excel)

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Вы можете создать цикл, который выполняет эту работу.

за три шага:

if!require(plyr) install.packages(plyr) 
df_4col <- data.frame() # a dataframe that after function must contain all four columns data
df_5col <- data.frame() # the same eith five colums
df_4list <- c() # a list with the filenames
df_5list <- c() # a list with the filenames

for (i in 1:length(nontidal_list)){
df <- read_excel(nontidal_list[i])
if (length(df)==4) {
    df_4col<-plyr::rbind.fill(df_4col, df) 
    df_4_list<-append(df_4list, nontidal_list[i]} else
if (length(df)==5) {
    df_5col<-plyr::rbind.fill(df_4col, df) 
    df_5list<-append(df_5list, nontidal_list[i]} 
}
0 голосов
/ 19 апреля 2019

Поскольку вы не предоставили пример набора данных, мы притворимся, что он выглядит так:

> nontidal_water_level <- lapply(1:4, function(i) data.frame(matrix(1:12 * i, ncol = 3 + (i %% 2))))
> str(nontidal_water_level)
List of 4
 $ :'data.frame':   3 obs. of  4 variables:
  ..$ X1: int [1:3] 1 2 3
  ..$ X2: int [1:3] 4 5 6
  ..$ X3: int [1:3] 7 8 9
  ..$ X4: int [1:3] 10 11 12
 $ :'data.frame':   4 obs. of  3 variables:
  ..$ X1: int [1:4] 2 4 6 8
  ..$ X2: int [1:4] 10 12 14 16
  ..$ X3: int [1:4] 18 20 22 24
 $ :'data.frame':   3 obs. of  4 variables:
  ..$ X1: int [1:3] 3 6 9
  ..$ X2: int [1:3] 12 15 18
  ..$ X3: int [1:3] 21 24 27
  ..$ X4: int [1:3] 30 33 36
 $ :'data.frame':   4 obs. of  3 variables:
  ..$ X1: int [1:4] 4 8 12 16
  ..$ X2: int [1:4] 20 24 28 32
  ..$ X3: int [1:4] 36 40 44 48

Для вопроса № 1 вы можете узнать столбцы каждого из них, повторив цикл и используя ncol, а затем поместив кадры данных с одинаковым количеством столбцов в отдельные списки:

> ncolumns <- lapply(nontidal_water_level, ncol)
> nontidal_3col <- nontidal_water_level[ncolumns == 3]
> nontidal_4col <- nontidal_water_level[ncolumns == 4]

По вопросу № 2 вы можете позвонить rbind по всем элементам каждого списка:

> (nontidal_3col <- do.call(rbind, nontidal_3col))
  X1 X2 X3
1  2 10 18
2  4 12 20
3  6 14 22
4  8 16 24
5  4 20 36
6  8 24 40
7 12 28 44
8 16 32 48
> (nontidal_4col <- do.call(rbind, nontidal_4col))
  X1 X2 X3 X4
1  1  4  7 10
2  2  5  8 11
3  3  6  9 12
4  3 12 21 30
5  6 15 24 33
6  9 18 27 36

Наконец, для вопроса 3 вы можете использовать пакет типа writexl , но я бы порекомендовал просто записать его как .csv:

write.csv(nontidal_3col, "my_3_column_file.csv")
write.csv(nontidal_4col, "my_4_column_file.csv")
...