r语言 - 使用 dplyr 按特定组中的变量拆分



如何使用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))

我需要按混合组和该组中的样本将此数据帧拆分为另外两个数据帧。第一组将是没有sample11行的所有数据帧,第二组 — 没有sample10行。像这样的东西,但更现代的方式。我相信有一个功能(

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

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

试试这个

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

到管道形式

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

你可以试试,

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

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

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

为了对所有样本标签重复筛选,我将采用唯一的样本值,沿该值进行映射,然后进行筛选以排除每个样本值。

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或其他任何东西来应用进一步的功能。

最新更新