【问题标题】:Subset larger Dataframe into smaller ones in R?在R中将较大的Dataframe子化为较小的Dataframe?
【发布时间】:2022-01-03 20:37:43
【问题描述】:

我有一个更大的数据框,我想根据 2 列和不断变化的第 3 列从中拆分。

我在移动设备上很难给出一个可重复的例子,所以我会尽力描述。

我有一个包含 10 列的大型数据框,前 2 列是 ID 和年份。

我想要较小的,其中第三列将是其余 8 列中的每一列。

所以总共有 8 个较小的数据帧

我试过了:

newDF1

newDF2

并获得结果,但有没有一种方法我不必写出每个单独的变量。 很抱歉格式不佳,任何帮助将不胜感激。

【问题讨论】:

    标签: r select subset


    【解决方案1】:

    添加到 danlooos 答案,如果你想要一个 Base R 解决方案,你可以只使用一个循环:

    for (col in colnames(iris)[-1:-2]) {
        assign(col, iris[, c("Sepal.Length", "Sepal.Width", col)], envir = globalenv())
    }
    

    或者做同样的事情并将生成的数据框存储在一个列表中,我个人觉得这样更简洁:

    new_frames <- list()
    for (col in colnames(iris)[-1:-2]) {
        new_frames <- append(new_frames, list(iris[, c("Sepal.Length", "Sepal.Width", col)]))
    }
    

    【讨论】:

    • 这不会使用assign创建新对象
    • @danlooo 是的,你是对的。我编辑了答案以包含它。
    【解决方案2】:

    拆分属于一起的数据通常是不好的做法。 但是,您可以使用 assign 根据表达式自动创建新的 R 对象:

    library(tidyverse)
    columns <-
      iris %>%
      colnames() %>%
      setdiff("Species")
    columns
    #> [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"
    
    columns %>%
      walk(~ {
        data <- iris %>% head(2) %>% select_at(c("Species", .x))
        assign(.x, data, envir = globalenv())
      })
    
    # access created objects
    Sepal.Width
    #>   Species Sepal.Width
    #> 1  setosa         3.5
    #> 2  setosa         3.0
    Sepal.Length
    #>   Species Sepal.Length
    #> 1  setosa          5.1
    #> 2  setosa          4.9
    

    reprex package (v2.0.1) 于 2021 年 11 月 25 日创建

    【讨论】:

    • 完全按照我的意愿工作,谢谢!
    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 2019-07-10
    • 2019-06-07
    • 2018-10-03
    • 1970-01-01
    • 2018-07-02
    • 2023-01-11
    • 2021-12-22
    相关资源
    最近更新 更多