【问题标题】:Automatically subset data frame by factor按因子自动对数据帧进行子集化
【发布时间】: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


    【解决方案1】:

    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返回的列表项?
    • 其实这不是我想要的。我想要作为 df 子集的新数据帧,其中 df$x only = a。我希望将新数据框称为“a”。
    • 啊,我明白你的意思了。更新了答案。
    • 谢谢!这很好用! (虽然对于我的数据,我需要使用“唯一”而不是级别。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多