写入到 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 全局环境中的所有非零行数据帧的主要内容,如果未能解决你的问题,请参考以下文章
Jmeter存储测试结果&写入结果到Excel之环境准备&测试数据结构准备&写入结果到Excel之代码准备&写入结果到Excel(十九)