У меня есть большой набор данных, в котором я хотел бы использовать 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 кадров данных, потому что я пытаюсь преобразовать их каждый в матрицу после другой функции. Любая помощь будет высоко оценена!
Мы можем использовать 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))
@Cam.S Я думаю, потому что после filter
в каждом подмножестве осталось только 2 элемента? Также для доступа к отдельным спискам вы можете назначить вывод первых двух параметров переменной, скажем, plot_list
, а затем использовать plot_list[[1]]
, plot_list[[2]]
для доступа к ним.
Удивительно. Как я могу преобразовать все результаты в разные кадры данных? Например, ds_1, ds_2, ds_3?
@Luis Назовите вывод списка. Если вы сохраните вывод в переменной с именем plot_list
, вы можете сделать names(plot_list) <- paste0('ds_', seq_along(plot_list))
, а затем использовать list2env(plot_list, .GlobalEnv)
.
Привет! Благодарю за ваш ответ. Я пробовал каждый метод, и первые два метода работают. Мне любопытно, почему цикл
for
хранит только два наблюдения в каждом из списков... Второй дополнительный вопрос: как получить доступ к каждому из фреймов данных в списке (другими словами, я хочу применить матричную функцию к каждому из 12 новых фреймов данных)