在R中将较大的Dataframe子化为较小的Dataframe?

Posted

技术标签:

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

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

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

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

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

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

我试过了:

newDF1

newDF2

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

【问题讨论】:

【参考方案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 日创建

【讨论】:

完全按照我的意愿工作,谢谢!

以上是关于在R中将较大的Dataframe子化为较小的Dataframe?的主要内容,如果未能解决你的问题,请参考以下文章

Python Dataframe:在一列上使用Groupby计算R ^ 2和RMSE

渐进式滚动子scrollView

右 | sf:我在每个点周围都有点和 2 个缓冲区。如果较大的缓冲区重叠(但较小的不重叠),如何将这些点组合成单个单元?

在较大的 bmp 文件中查找较小的 bmp 文件

CDQ分治

在较大的图像上覆盖较小的图像 python OpenCv