【问题标题】:Split by variable in a specific group using dplyr使用 dplyr 按特定组中的变量拆分
【发布时间】:2020-02-12 14:14:14
【问题描述】:

如何使用dplyr 拆分和复制数据帧?想象一下,我有一个带有分组变量(即group)、样本ID(即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))

我需要通过 mix 组将该数据帧拆分为另外两个数据帧,并从该组中采样。第一组将是没有sample11 行的所有数据框,第二组将是没有sample10 行的所有数据框。像这样但更现代的方式。我相信有这个功能)

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

我需要对数十个目标样本进行此操作,然后为每个 df 映射一个函数。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    试试这个

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

    到管道形式

    df %>%
      { which(.$group == "mix") } %>%
      map(~ df[-., ])
    

    【讨论】:

      【解决方案2】:

      你可以试试,

      lapply(c('sample10', 'sample11'), function(i)df[!df$sample %in% i,])
      

      【讨论】:

        【解决方案3】:

        您可以在plyr 包中使用ddply()(“dd”表示“数据框到数据框”)

        my_list <- df %>% dlply("sample")
        

        【讨论】:

          【解决方案4】:

          要对所有样本标签重复过滤,我会采用唯一的样本值,沿着该值映射,然后过滤以排除每一个。

          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 或其他任何方式来应​​用更多功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-08
            • 2020-06-15
            相关资源
            最近更新 更多