【问题标题】:Subsetting data by a unique ID按唯一 ID 子集数据
【发布时间】:2020-05-04 03:04:37
【问题描述】:

我尝试根据 ID(可以是任何数字)和一个条件对数据进行子集化。 一个例子可能是;

我有几辆装有不同数量的汽缸和不同数量的化油器的汽车。 我想要每个 cilinders 唯一值的子集。在 cilinders 的子集中,我想要化油器的每个唯一值的子集。

到目前为止,我尝试的是通过唯一数量的 cilinder 对 mtcars 数据进行子集化。 这很好用,它给了我 3 个子集。 我就是用这个来做的;

# Loading
data(mtcars)

mtcars_split <- split(mtcars, mtcars$cyl)
new_names <- c("subset1", "subset2", "subset3", "subset4")
for (i in 1:length(mtcars_split)) {
  assign(new_names[i], mtcars_split[[i]])
}        

没有使用子集 4,因为 mtcars 数据集中只有三个不同数量的 cilinder。

但是现在我想用化油器的数量对子集 1、子集 2 和子集 3 做同样的事情。

然后我尝试了

#For cylinder 4, carb 1 and 2 
mtcars_split2 <- split(subset1, subset1$carb)
new_names <- c("subset1carb1", "subset1carb2")
for (i in 1:length(mtcars_split2)) {
  assign(new_names[i], mtcars_split2[[i]])
}

#for cyclinder 6, carb 1,2 and 3
mtcars_split3 <- split(subset2, subset2$carb)
new_names <- c("subset2carb1", "subset2carb2", "subset2carb3")
for (i in 1:length(mtcars_split3)) {
  assign(new_names[i], mtcars_split3[[i]])
}

#for cyclinder 8, carb 1,2,3 and 4
mtcars_split4 <- split(subset3, subset3$carb)
new_names <- c("subset3carb1", "subset3carb2", "subset3carb3", "subset3carb4")
for (i in 1:length(mtcars_split4)) {
  assign(new_names[i], mtcars_split4[[i]])
}

#etc

但是必须有更简单的方法来做到这一点? 在大型数据集中,这种手动解决方案需要太多时间。 你会得到很多不同的组合,你都必须在某个时候定义它们。

如果 R 能够基于这两个条件自动生成和命名唯一子集,那就太好了。汽缸和化油器。

【问题讨论】:

  • 您可以通过多列splitsplit(mtcars, list(mtcars$cyl, mtcars$carb))
  • 像魅力一样工作!但是我将如何命名或定义我的子集?在某个时候我会有很多组合。 R 不能在基于子集1_6_2、6 个汽缸和 2 个碳水化合物的值导出时命名它们吗?
  • 您要将它们导出为单独的 csv 文件还是一个组合的文件?
  • 分开,我想导出所有子集,这样我会得到很多文件,但这没关系。关键是他们有一个合适的名字。

标签: r loops subset


【解决方案1】:

我们可以split基于多列的数据,删除空列表并使用列表名称写入数据。这可以在基础 R 中完成:

temp <- Filter(nrow, split(mtcars, list(mtcars$cyl, mtcars$carb)))
Map(write.csv, temp, paste0("Subset", names(temp), ".csv"))

或在tidyverse

library(tidyverse)
split(mtcars, list(mtcars$cyl, mtcars$carb)) %>%
   keep(~nrow(.x) > 0) %>%
   imap(~write.csv(.x, paste0("Subset", .y, ".csv")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2022-01-11
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多