将不同长度的数据帧绑定到单独列中的 Excel 文件
Binding dataframes with different length to an Excel file in separate columns
数据框的行数不同。数据集不均匀
那么如何在单张单列中水平添加数据框呢?
下面是我用来为示例数据编写单独数据框的代码
files <- list.files(pattern= '*.shp')
a<- read_sf("fire_archive_M6_139248.shp")
b<- read_sf("fire_nrt_M6_139248.shp")
aa = as.data.frame(a$ACQ_DATE)
bb = as.data.frame(b$ACQ_DATE)
cc = as.data.frame(c$ACQ_DATE)
library("writexl")
setwd("D:/fire_work_cov/test3/csv")
write_xlsx(aa,"2020a.xlsx")
write_xlsx(bb,"2020b.xlsx")
write_xlsx(cc,"2019.xlsx")
下面是aa和bb的头部(每个数据的完整头部长度不同)
> head(aa)
a$ACQ_DATE
1 2020-03-02
2 2020-03-02
3 2020-03-02
4 2020-03-02
5 2020-03-02
6 2020-03-03
> bb = as.data.frame(b$ACQ_DATE)
> head(bb)
b$ACQ_DATE
1 2020-04-01
2 2020-04-01
3 2020-04-01
4 2020-04-01
5 2020-04-01
6 2020-04-01
> head(cc)
c$ACQ_DATE
1 2019-03-01
2 2019-03-01
3 2019-03-01
4 2019-03-01
5 2019-03-02
6 2019-03-02
您可以使用 rowr::cbind.fill
:
### Creating a sample dataset ###
df1 <- data.frame(col = c(1, 2, 3))
df2 <- data.frame(col = c(5, 6))
df3 <- data.frame(col = c(4, 4, 9, 10))
df <- list(df1, df2, df3)
### Loading required library ###
library(rowr) ## Not available for R 4.0.2
### binding the columns for the list of dataframes ###
#### using do.call to apply cbind.fill on a list of dataframes
df.e <- do.call(cbind.fill, c(df, fill=NA))
### writing to csv or excel file ###
#### setting NA-string to "" to have empty cells
#### setting writing row.names to false
write.csv(df.e, "D:\test.csv", na = "", row.names = FALSE)
或者按照 @akrun 的建议,在 base
中我们可以这样做:
mx <- max(sapply(df, nrow))
do.call(cbind, lapply(df, function(x) {rbind(x, x[seq_len(mx) > nrow(x),, drop = FALSE])}))
数据框的行数不同。数据集不均匀 那么如何在单张单列中水平添加数据框呢?
下面是我用来为示例数据编写单独数据框的代码
files <- list.files(pattern= '*.shp')
a<- read_sf("fire_archive_M6_139248.shp")
b<- read_sf("fire_nrt_M6_139248.shp")
aa = as.data.frame(a$ACQ_DATE)
bb = as.data.frame(b$ACQ_DATE)
cc = as.data.frame(c$ACQ_DATE)
library("writexl")
setwd("D:/fire_work_cov/test3/csv")
write_xlsx(aa,"2020a.xlsx")
write_xlsx(bb,"2020b.xlsx")
write_xlsx(cc,"2019.xlsx")
下面是aa和bb的头部(每个数据的完整头部长度不同)
> head(aa)
a$ACQ_DATE
1 2020-03-02
2 2020-03-02
3 2020-03-02
4 2020-03-02
5 2020-03-02
6 2020-03-03
> bb = as.data.frame(b$ACQ_DATE)
> head(bb)
b$ACQ_DATE
1 2020-04-01
2 2020-04-01
3 2020-04-01
4 2020-04-01
5 2020-04-01
6 2020-04-01
> head(cc)
c$ACQ_DATE
1 2019-03-01
2 2019-03-01
3 2019-03-01
4 2019-03-01
5 2019-03-02
6 2019-03-02
您可以使用 rowr::cbind.fill
:
### Creating a sample dataset ###
df1 <- data.frame(col = c(1, 2, 3))
df2 <- data.frame(col = c(5, 6))
df3 <- data.frame(col = c(4, 4, 9, 10))
df <- list(df1, df2, df3)
### Loading required library ###
library(rowr) ## Not available for R 4.0.2
### binding the columns for the list of dataframes ###
#### using do.call to apply cbind.fill on a list of dataframes
df.e <- do.call(cbind.fill, c(df, fill=NA))
### writing to csv or excel file ###
#### setting NA-string to "" to have empty cells
#### setting writing row.names to false
write.csv(df.e, "D:\test.csv", na = "", row.names = FALSE)
或者按照 @akrun 的建议,在 base
中我们可以这样做:
mx <- max(sapply(df, nrow))
do.call(cbind, lapply(df, function(x) {rbind(x, x[seq_len(mx) > nrow(x),, drop = FALSE])}))