【问题标题】:write to excel all non-zero-row dataframes in global environment写入到 excel 全局环境中的所有非零行数据帧
【发布时间】: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"

有什么想法吗? 谢谢

【问题讨论】:

    标签: r global-variables r-xlsx


    【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 2015-08-15
        • 1970-01-01
        • 2016-03-27
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多