R - 如何生成数据帧列表并将它们写入 excel 和 lapply
R - How to generate a list of data frames and write them into excel with lapply
所以这可能非常微妙,但我正在努力解决的基本原理是:使用 lapply 过滤一些主要数据框以创建许多小数据框。将这些小数据框(它们相关,因为它们共享一个过滤器)组合成一个多 sheet excel 文档。
我启用了这些包:
library(plyr); library(dplyr); library(XLConnect);
library(rJava); library(xlsxjars); library(xlsx);
library(tidyr)
我能够非常手动地获得所需的输出,但我确信有一种方法可以利用像 lapply 这样的函数(或者可能是另一个应用函数)来 运行 这个快一点。
我的原始数据要大得多,所以我将使用以下示例:
df1
Code Color Value
[1] A Red 10
[2] A Blue 15
[3] A Red 5
[4] B Green 20
[5] B Red 15
[6] C Green 10
df2
Code Level Value
[1] A All 150
[5] B All 200
[6] C All 500
为了这个例子,我们假设 df1 和 df2 除了共享 "Code".
之外是无关的
我从两个列表开始,指定哪些代码属于每个 "Person"(每个人都有一个独特的 "Codes" 列表,但这些 "Codes" 可以属于多个人)。
JoeCodes <- c("A","B","C")
JohnCodes <- c("A","B")
MaryCodes <- c("C")
这就是我遇到困难的地方。我知道我能做到:
Joedf1 <- df1 %>% filter(Code %in% JoeCodes)
Joedf2 <- df2 %>% filter(Code %in% JoeCodes)
然后如果我想把它写进Excel我用
write.xlsx(as.data.frame(Joedf1), file="Joe.xlsx", sheetName="Joedf1", row.names=FALSE, showNA=FALSE)
write.xlsx(as.data.frame(Joedf2), file="Joe.xlsx", sheetName="Joedf2", append=TRUE, row.names=FALSE, showNA=FALSE)
我为约翰和玛丽重复这个过程。现在,现实是我有 13 个人要在 6 个不同的数据帧上进行过滤。这很麻烦,因为列表可能会更改并且只会按月增长。
我的想法是我应该能够完成这样的事情:
AllPersons <- c("JoeCodes","JohnCodes","MaryCodes")
然后使用lapply之类的东西为"AllPersons"中的所有列表过滤df1并在"Joedf1"、"Johndf1"、[=58=中生成以下数据帧].
然后重复这个过程过滤df2生成数据帧"Joedf2","Johndf2","Marydf2"
然后创建新列表(我可以看到如何简化这一步,因为每个数据框都有名称,但我不知道如何完成):
JoeAll <- c("Joedf1","Joedf2")
JohnAll <- c("Johndf1","Johndf2")
MaryAll <- c("Marydf1","Marydf2")
AllFrames <- c("JoeAll", "JohnAll", "MaryAll")
从那里我想使用 write.xlsx 为 AllFrames 中的每个列表创建传播 sheet 并为每个基础数据帧创建 sheet。
我想做的事情有意义吗?我觉得真的停留在概念层面上。
任何 help/guidance 非常感谢。
我认为以下内容对您有用,我包含了一些示例数据。不需要 lapply
,一个简单的 for 循环也可以。您也可以将 for 循环的主体包装在一个函数中并从 lapply
调用它,但它不会在此处增加值。
df1=data.frame(Code=c('A','A','B','B'),test=c(1,1,1,1))
df2=df1
library(dplyr)
library(xlsx)
JoeCodes <- c("A","B","C")
JohnCodes <- c("A","B")
MaryCodes <- c("C")
allCodes = list(Joe = JoeCodes, John = JohnCodes,Mary = MaryCodes)
for(i in 1:length(allCodes))
{
df1_subset <- df1 %>% filter(Code %in% allCodes[[i]])
df2_subset <- df2 %>% filter(Code %in% allCodes[[i]])
name = names(allCodes)[i]
if(nrow(df1_subset)>0)
write.xlsx(as.data.frame(df1_subset), file=paste0(name,".xlsx"), sheetName=paste0(name,"df1"), row.names=FALSE, showNA=FALSE)
if(nrow(df2_subset)>0)
write.xlsx(as.data.frame(df2_subset), file=paste0(name,".xlsx"), sheetName=paste0(name,"df2"), append=TRUE, row.names=FALSE, showNA=FALSE)
}
所以这可能非常微妙,但我正在努力解决的基本原理是:使用 lapply 过滤一些主要数据框以创建许多小数据框。将这些小数据框(它们相关,因为它们共享一个过滤器)组合成一个多 sheet excel 文档。
我启用了这些包:
library(plyr); library(dplyr); library(XLConnect);
library(rJava); library(xlsxjars); library(xlsx);
library(tidyr)
我能够非常手动地获得所需的输出,但我确信有一种方法可以利用像 lapply 这样的函数(或者可能是另一个应用函数)来 运行 这个快一点。
我的原始数据要大得多,所以我将使用以下示例:
df1
Code Color Value
[1] A Red 10
[2] A Blue 15
[3] A Red 5
[4] B Green 20
[5] B Red 15
[6] C Green 10
df2
Code Level Value
[1] A All 150
[5] B All 200
[6] C All 500
为了这个例子,我们假设 df1 和 df2 除了共享 "Code".
之外是无关的我从两个列表开始,指定哪些代码属于每个 "Person"(每个人都有一个独特的 "Codes" 列表,但这些 "Codes" 可以属于多个人)。
JoeCodes <- c("A","B","C")
JohnCodes <- c("A","B")
MaryCodes <- c("C")
这就是我遇到困难的地方。我知道我能做到:
Joedf1 <- df1 %>% filter(Code %in% JoeCodes)
Joedf2 <- df2 %>% filter(Code %in% JoeCodes)
然后如果我想把它写进Excel我用
write.xlsx(as.data.frame(Joedf1), file="Joe.xlsx", sheetName="Joedf1", row.names=FALSE, showNA=FALSE)
write.xlsx(as.data.frame(Joedf2), file="Joe.xlsx", sheetName="Joedf2", append=TRUE, row.names=FALSE, showNA=FALSE)
我为约翰和玛丽重复这个过程。现在,现实是我有 13 个人要在 6 个不同的数据帧上进行过滤。这很麻烦,因为列表可能会更改并且只会按月增长。
我的想法是我应该能够完成这样的事情:
AllPersons <- c("JoeCodes","JohnCodes","MaryCodes")
然后使用lapply之类的东西为"AllPersons"中的所有列表过滤df1并在"Joedf1"、"Johndf1"、[=58=中生成以下数据帧].
然后重复这个过程过滤df2生成数据帧"Joedf2","Johndf2","Marydf2"
然后创建新列表(我可以看到如何简化这一步,因为每个数据框都有名称,但我不知道如何完成):
JoeAll <- c("Joedf1","Joedf2")
JohnAll <- c("Johndf1","Johndf2")
MaryAll <- c("Marydf1","Marydf2")
AllFrames <- c("JoeAll", "JohnAll", "MaryAll")
从那里我想使用 write.xlsx 为 AllFrames 中的每个列表创建传播 sheet 并为每个基础数据帧创建 sheet。
我想做的事情有意义吗?我觉得真的停留在概念层面上。
任何 help/guidance 非常感谢。
我认为以下内容对您有用,我包含了一些示例数据。不需要 lapply
,一个简单的 for 循环也可以。您也可以将 for 循环的主体包装在一个函数中并从 lapply
调用它,但它不会在此处增加值。
df1=data.frame(Code=c('A','A','B','B'),test=c(1,1,1,1))
df2=df1
library(dplyr)
library(xlsx)
JoeCodes <- c("A","B","C")
JohnCodes <- c("A","B")
MaryCodes <- c("C")
allCodes = list(Joe = JoeCodes, John = JohnCodes,Mary = MaryCodes)
for(i in 1:length(allCodes))
{
df1_subset <- df1 %>% filter(Code %in% allCodes[[i]])
df2_subset <- df2 %>% filter(Code %in% allCodes[[i]])
name = names(allCodes)[i]
if(nrow(df1_subset)>0)
write.xlsx(as.data.frame(df1_subset), file=paste0(name,".xlsx"), sheetName=paste0(name,"df1"), row.names=FALSE, showNA=FALSE)
if(nrow(df2_subset)>0)
write.xlsx(as.data.frame(df2_subset), file=paste0(name,".xlsx"), sheetName=paste0(name,"df2"), append=TRUE, row.names=FALSE, showNA=FALSE)
}