【发布时间】:2017-11-09 09:10:33
【问题描述】:
在编写函数以根据列的值自动对数据框进行子集化时寻求帮助?例如,
df$x 包含值 a、b、c、d
我想制作名为 a、b、c、d 的单独数据框,其中包含所有值 x == 'a' 或 x == 'b' 等。我知道几种手动执行此操作的方法,但我希望有关如何自动化的指导?谢谢!
【问题讨论】:
标签: r function dataframe filter subset
在编写函数以根据列的值自动对数据框进行子集化时寻求帮助?例如,
df$x 包含值 a、b、c、d
我想制作名为 a、b、c、d 的单独数据框,其中包含所有值 x == 'a' 或 x == 'b' 等。我知道几种手动执行此操作的方法,但我希望有关如何自动化的指导?谢谢!
【问题讨论】:
标签: r function dataframe filter subset
split 函数返回子集数据帧的列表:
split(df, df$x)
编辑:
如果您想为每个子集数据框创建一个新对象:
for (i in levels(df$x)) {
command <- paste0(i, "<-subset(df, x=='", i, "')")
eval(parse(text=command))
}
编辑 2:
要按两个或多个变量进行拆分,更自动化的解决方案是创建一个函数,该函数将数据框和列名称作为输入,用于对数据框进行子集化:
create_new_df <- function (dataframe, vars) {
# Creates a new data frame in the global environment based on names of variables in 'vars'
split(dataframe, as.list(dataframe[, vars]), drop = TRUE) %>%
lapply(function (subset_dataframe) {
new_object_name <- paste(as.character(subset_dataframe[1, vars])
# The double arrowed '<<-' creates a new object in the global environment
command <- paste0(new_object_name, collapse="_"), "<<-subset_dataframe")
eval(parse(text=command))
}) %>%
invisible()
}
然后可以使用此函数创建具有任意变量组合的新对象:
variables <- c("x", "y", "z")
create_new_df(df, variables)
【讨论】:
split返回的列表项?
也许不是最好的方法,但可以完成工作。
vars_df = unique(df$x)
for (i in 1:length(vars_df)) {
assign(paste0(vars_df[i]), df %>% filter(x == vars_df[i]), envir = .GlobalEnv)
}
【讨论】: