Зацикливание dplyr и создание нескольких фреймов данных

У меня есть большой набор данных, в котором я хотел бы использовать dplyr, фильтровать и выбирать данные для создания 12 отдельных кадров данных.

По сути, я использую только два столбца данных из большего набора данных. Первый столбец — «участок», где я фильтрую по номеру «участка» и другому условию в другом третьем столбце («pos_ID»). Я хочу создать цикл, который фильтрует по номеру графика (я пробовал plot==[i]) и третьему условию, а затем создает новый фрейм данных. Цикл будет повторяться 12 раз (поскольку сюжет охватывает от 1 до 12).

Вот код, который я использовал без цикла (на основе выборочных данных)

 p1_Germ <- data %>% #p1 stands for plot 1
   filter(plot==1, pos_ID<21) %>% 
   select(germ_bin)

Вот код, который я пытался включить в цикл (на основе выборочных данных)

for(i in seq_along(plot)) {
   data %>%
     group_by(plot[[i]], pos_ID<21) %>%
     select(germ_bin)
 }

Вот некоторые примерные данные

plot <- c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12)
germ_bin <- c(0,0,1,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0)
pos_ID <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
dataset <- data.frame(plot, germ_bin, pos_ID)
dataset

Я предполагаю, что нужно использовать список, но я не знаком с циклами и списком и не смог найти решение в Интернете. Мне нужно создать 12 кадров данных, потому что я пытаюсь преобразовать их каждый в матрицу после другой функции. Любая помощь будет высоко оценена!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 560
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мы можем использовать group_split и map для filter на основе критериев, чтобы получить список фреймов данных.

library(dplyr)
library(purrr)

dataset %>%
 group_split(plot) %>%
 map(. %>% filter(pos_ID < 21) %>% select(germ_bin))

#[[1]]
# A tibble: 2 x 1
#  germ_bin
#     <dbl>
#1        0
#2        0

#[[2]]
# A tibble: 2 x 1
#  germ_bin
#     <dbl>
#1        1
#2        0

#[[3]]
# A tibble: 2 x 1
#  germ_bin
#     <dbl>
#1        1
#2        0
#....

Для общего примера, если вы хотите удалить пустые группы, вы можете сначала filter

dataset %>%
  filter(pos_ID < 21) %>%
  group_split(plot) %>%
  map(. %>% select(germ_bin))

Что касается вашей попытки с циклом for, вы можете исправить это, выполнив

unique_plot <- unique(dataset$plot)
plot_list <- list(length = length(unique_plot))

for(i in seq_along(unique_plot)) {
   plot_list[[i]] <- dataset %>%
        filter(plot == unique_plot[i], pos_ID<21) %>%
        select(germ_bin)
}

Или оставить его полностью в базе R

lapply(split(dataset, dataset$plot), function(x) 
             subset(x, pos_ID < 21, select = germ_bin, drop = FALSE))

Привет! Благодарю за ваш ответ. Я пробовал каждый метод, и первые два метода работают. Мне любопытно, почему цикл for хранит только два наблюдения в каждом из списков... Второй дополнительный вопрос: как получить доступ к каждому из фреймов данных в списке (другими словами, я хочу применить матричную функцию к каждому из 12 новых фреймов данных)

Cam.S 29.05.2019 15:34

@Cam.S Я думаю, потому что после filter в каждом подмножестве осталось только 2 элемента? Также для доступа к отдельным спискам вы можете назначить вывод первых двух параметров переменной, скажем, plot_list, а затем использовать plot_list[[1]], plot_list[[2]] для доступа к ним.

Ronak Shah 29.05.2019 16:18

Удивительно. Как я могу преобразовать все результаты в разные кадры данных? Например, ds_1, ds_2, ds_3?

Luis 23.09.2021 21:31

@Luis Назовите вывод списка. Если вы сохраните вывод в переменной с именем plot_list, вы можете сделать names(plot_list) <- paste0('ds_', seq_along(plot_list)), а затем использовать list2env(plot_list, .GlobalEnv).

Ronak Shah 24.09.2021 01:15

Другие вопросы по теме