繁体   English   中英

通过唯一 ID 对数据进行子集化

[英]Subsetting data by a unique ID

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

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

到目前为止,我尝试的是通过唯一数量的 cilinders 对 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 能够以某种方式根据这 2 个条件自动生成和命名唯一的子集,那就太好了。 汽缸和化油器。

我们可以基于多列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")))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM