首页 > 解决方案 > 如何编写一个函数来根据变量的值创建多个数据框?

问题描述

我有一个数据框,其中包含一个名为 ProgramName 的变量,其中包含不同程序的名称,但有时这些名称会发生​​变化。我想创建一个函数,为每个程序名称创建一个数据框。类似于子集函数的作用。

数据帧中还有其他特征也需要过滤,因此以下代码会处理这些特征

ma <- as.data.frame(Missing_AttendanceKIDS, stringsAsFactors = FALSE)
mi <- as.data.frame(Missing_AttendanceSIS, stringsAsFactors = FALSE)
mi <- mi %>% select(c("ProgramName", "FnLnDOB", "Funding", "Missing     Days"))
ma$ProgramName <- as.character(ma$ProgramName)
ma <- ma[!(ma$Funder == "School Board (FL)" & ma$Issue == "non-existent"), ]
HaveFirstTermCode <- ma %>% subset(FirstTermCodeDate != "NULL")
ma <- ma[!(ma$FirstTermCodeDate != "NULL"), ]
InvalidTermCode <- ma %>% subset(Issue == "invalid term code")
ma <- ma[!(ma$Issue == "invalid term code"), ]
Blkgenerator <- ma %>% subset(ma$Issue == "non-existent" & ma$Funder != "School Board (FL)")
ma <- ma[!(ma$Issue == "non-existent" & ma$Funder != "School Board (FL)"), ]

ma$ProgramName <- as.factor(ma$ProgramName)

下面的代码是我希望该函数执行的操作。如果可能的话,还给结果数据框提供程序的名称..

Missing_Attendance_Acadiana <- subset(ma, ma$ProgramName == "Acadiana" & ma$Issue == "blank")
Missing_Attendance_Alabama <- subset(ma, ma$ProgramName == "Alabama Family Services" & ma$Issue == "blank")
Missing_Attendance_Beaufort <- ma[ma$ProgramName %like% "Beaufort" & ma$Issue == "blank", ]
Missing_Attendance_Piedmont <- ma[ma$ProgramName %like% "Piedmont" & ma$Issue == "blank", ]

获得数据框后,我正在运行以下函数以使用 R Markdown 创建包含数据框的 html。

tablemu = function(df) kable(df, row.names = FALSE, caption = "Missing Attendance") %>%
kable_styling(bootstrap_options = "striped", position = "center", full_width = T, fixed_thead = list(enabled = T, background = "Orange"), stripe_color =    list(enabled = T, background = "yellow") ) %>%
column_spec(1:4, bold = T, border_left = T, border_right = T)

标签: r

解决方案


只需使用split它从因子创建一个命名的数据框列表,然后通过您需要的方法运行它lapply

sub <- ma[ma$Issue == "blank",]
df_list <- split(sub, sub$ProgramName)

lapply(df_list, tablemu)

或者,使用by(object-oriented wrapper to tapply) 来简化上述两个调用。下面将输出您的 HTML 输出的打印列表:

sub <- ma[ma$Issue == "blank",]
by(sub, sub$ProgramName, tablemu)

无需用许多变量来淹没您的全局环境。


推荐阅读