Подстановка данных по уникальному идентификатору - PullRequest
2 голосов
/ 17 января 2020

Я пытаюсь установить поднабор данных на основе идентификатора (может быть любым числом) и одного условия. Примером может быть;

У меня есть несколько автомобилей с разным количеством цилиндров и разным количеством карбюраторов. Я хочу подмножество для каждого уникального значения цилиндров. И в подмножествах цилиндров я снова хочу подмножество для каждого уникального значения карбюраторов.

До сих пор я пытался установить подстановку данных 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 имеется только три разных числа цилиндров.

Но теперь я хочу сделать то же самое для подмножества 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 условий. цилиндры и карбюраторы.

1 Ответ

1 голос
/ 17 января 2020

Мы можем 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")))
...