首页 > 解决方案 > 按唯一 ID 子集数据

问题描述

我尝试根据 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 能够基于这两个条件自动生成和命名唯一子集,那就太好了。汽缸和化油器。

标签: rloopssubset

解决方案


我们可以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")))

推荐阅读