按因子

时间:2017-06-07 20:42:09

标签: r function dataframe filter subset

寻找帮助编写函数以根据列的值自动分配数据帧的帮助?例如,

df $ x包含值a,b,c,d

我想制作名为a,b,c,d的单独数据框,其中包含所有值x =='a'或x =='b'等。我知道有几种方法可以手动执行此操作,但我希望有关如何自动化的指导?谢谢!

2 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:0)

也许不是最好的方法,但会完成工作。

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)
}