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