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