Разделить по переменной в заданной группе c с помощью dplyr - PullRequest
1 голос
/ 12 февраля 2020

Как я могу разделить и дублировать кадр данных, используя dplyr? Просто представьте, что у меня есть фрейм данных с переменной группировки (т.е. group), идентификатором выборки (т.е. sample) и значением.

library(tidyverse)

df <- tibble(group = c(rep(LETTERS[1:3], 3), "mix", "mix"),
       sample = paste0("sample", seq(1, 11)),
       value = rnorm(11, 20, sd = 30))

Мне нужно разбить этот фрейм данных на еще два фрейма данных смешайте группу и образец из этой группы. Первая группа будет представлять собой весь массив данных без строки sample11, вторая - без строки sample10. Как то так, но более современно. Я считаю, что есть функция для этого)

list(
  df1 = df %>% filter(sample != "sample10"),
  df2 = df %>% filter(sample != "sample11")
)

Мне нужно сделать это для десятков целевых выборок, а затем отобразить функцию для каждого df.

Ответы [ 4 ]

2 голосов
/ 12 февраля 2020

Попробуйте это

lapply(which(df$group == "mix"), function(x) df[-x, ])

К форме трубы

df %>%
  { which(.$group == "mix") } %>%
  map(~ df[-., ])
1 голос
/ 12 февраля 2020

Вы можете использовать ddply() в пакете plyr («dd» означает «фрейм данных в фрейм данных»)

my_list <- df %>% dlply("sample")
1 голос
/ 12 февраля 2020

Можно попробовать,

lapply(c('sample10', 'sample11'), function(i)df[!df$sample %in% i,])
0 голосов
/ 12 февраля 2020

Чтобы повторить фильтрацию для всех меток выборки, я бы взял уникальные значения выборки, сопоставил их и отфильтровал, чтобы исключить каждую из них.

library(dplyr)

df_list <- unique(df$sample) %>%
  purrr::map(~filter(df, sample != .))
df_list[1]
#> [[1]]
#> # A tibble: 10 x 3
#>    group sample    value
#>    <chr> <chr>     <dbl>
#>  1 B     sample2   -7.49
#>  2 C     sample3   34.1 
#>  3 A     sample4   61.4 
#>  4 B     sample5   51.9 
#>  5 C     sample6   15.7 
#>  6 A     sample7  -20.6 
#>  7 B     sample8   39.8 
#>  8 C     sample9   47.6 
#>  9 mix   sample10  37.3 
#> 10 mix   sample11  14.4

Еще лучше, назовите кадры данных для отображения какой образец был исключен:

df_list_named <- unique(df$sample) %>%
  purrr::set_names(paste, "excluded", sep = "_") %>%
  purrr::map(~filter(df, sample != .))
df_list_named[1]
#> $sample1_excluded
#> # A tibble: 10 x 3
#>    group sample    value
#>    <chr> <chr>     <dbl>
#>  1 B     sample2   -7.49
#>  2 C     sample3   34.1 
#>  3 A     sample4   61.4 
#>  4 B     sample5   51.9 
#>  5 C     sample6   15.7 
#>  6 A     sample7  -20.6 
#>  7 B     sample8   39.8 
#>  8 C     sample9   47.6 
#>  9 mix   sample10  37.3 
#> 10 mix   sample11  14.4

Оттуда, вызовите другой map или любой другой, чтобы применить дополнительные функции.

...