写入到 excel 全局环境中的所有非零行数据帧

Posted

技术标签:

【中文标题】写入到 excel 全局环境中的所有非零行数据帧【英文标题】:write to excel all non-zero-row dataframes in global environment 【发布时间】:2020-03-22 21:06:53 【问题描述】:

我的全局环境中有一组空 (0-row) 和非空 (>0-row) Tibbles,我想仅选择 相关的,即非空的,并将它们发送到write.xlsx命令。

这似乎应该是相当可行的任务,但我很难绕过它。

为了简单起见,假设流程中的一些复杂代码会生成小标题 A、B 和 C

library(dplyr)
library(xlsx)
A<-tibble(a=1:3,aa=2:4,aaa=3:5)
B<-tibble(b=rep(1,3),bb=rep(2,3),bbb=rep(3,3))
B<-B %>% filter(b>4)
C<-tibble(c=3:1,bb=4:2,bbb=5:3)
A;B;C

# A tibble: 3 x 3
      a    aa   aaa
  <int> <int> <int>
1     1     2     3
2     2     3     4
3     3     4     5
# A tibble: 0 x 3
# ... with 3 variables: b <dbl>, bb <dbl>, bbb <dbl>
# A tibble: 3 x 3
      c    bb   bbb
  <int> <int> <int>
1     3     4     5
2     2     3     4
3     1     2     3

现在我只想写到 Excel 中的 Tibbles A 和 C,因为 B 是空的

所以我尝试了类似的东西

writexlsx<-function(x)
        if("tbl" %in% class(x))
                if(nrow(x)>0)  
                        write.xlsx(x,filename=paste(x,".xlsx",sep=""))
                
        


lapply(writexlsx,ls()) 

但 ls() 只是名称列表,而不是实际对象

ls()
[1] "A"         "B"         "C"         "writexlsx"

有什么想法吗? 谢谢

【问题讨论】:

【参考方案1】:

您可以使用get() 来获取带有字符向量的对象:

library(dplyr, warn.conflicts = FALSE)
library(writexl)
A<-tibble(a=1:3,aa=2:4,aaa=3:5)
B<-tibble(b=rep(1,3),bb=rep(2,3),bbb=rep(3,3))
B<-B %>% filter(b>4)
C<-tibble(c=3:1,bb=4:2,bbb=5:3)

get("A")
#> # A tibble: 3 x 3
#>       a    aa   aaa
#>   <int> <int> <int>
#> 1     1     2     3
#> 2     2     3     4
#> 3     3     4     5

writexlsx<-function(x)
  df <- get(x)
  if("tbl" %in% class(df))
    if(nrow(df)>0)  
      writexl::write_xlsx(df,path=paste(x,".xlsx",sep=""))
    
  


lapply(ls(), writexlsx) 
#> [[1]]
#> [1] "A.xlsx"
#> 
#> [[2]]
#> NULL
#> 
#> [[3]]
#> [1] "C.xlsx"
#> 
#> [[4]]
#> NULL

由reprex package (v0.3.0) 于 2019 年 11 月 27 日创建

【讨论】:

【参考方案2】:

这是一个函数,它可以将.GlobalRnv 中的所有数据帧作为 XLSX 文件获取和写入,或者将作为名称传递的数据帧写入参数dfnames

writexlsx <- function(dfnames)
  if(missing(dfnames))
    lst <- mget(ls())
  else
    lst <- mget(dfnames)
  
  lst <- lst[sapply(lst, inherits, "data.frame")]
  lst <- lst[sapply(lst, nrow) > 0]
  lapply(names(lst), function(x)
    write.xlsx(lst[[x]], file = paste0(x, ".xlsx"))
  )


writexlsx()

【讨论】:

以上是关于写入到 excel 全局环境中的所有非零行数据帧的主要内容,如果未能解决你的问题,请参考以下文章

通过python,将excel中的数据写入二维列表

TSQL - 列中所有非零值的平均值

python删除列的操作怎么操作的呢?

Jmeter存储测试结果&写入结果到Excel之环境准备&测试数据结构准备&写入结果到Excel之代码准备&写入结果到Excel(十九)

将Excel上千条数据写入到数据库中

高斯消元法的C++简单实现