通过唯一ID子集数据

安吉

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

我有几辆带有不同数量的cilcils和不同数量的化油器的汽车。我希望为cilcils的每个唯一值提供一个子集。在陶器子集中,我再次想要化油器的每个唯一值的子集。

到目前为止,我尝试的是通过唯一数量的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]])
}        

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

但是现在我想对子集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能够基于这两个条件以某种方式自动生成并命名唯一子集,那就太好了。cilcils和化油器。

罗纳克·沙

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章