处理列表中文件的问题

时间:2019-04-19 17:44:55

标签: r lapply xlsx

我已经通过创建目录(dir)并使用(lapply)导入了90个excel文件。我不确定这是否称为嵌套列表。在列表中导入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 :(得分:0)

由于您未提供示例数据集,因此我们将其装作如下:

> 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")

答案 1 :(得分:0)

您可以创建一个完成任务的循环。

三个步骤:

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]} 
}