我尝试根据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] 删除。
我来说两句