首页 > 解决方案 > 按组拆分数据帧,同时在每个部分中保持某些因子水平

问题描述

我正在尝试split()根据某个列将数据框切割成碎片。split()函数非常好,可以为每个因子级别获取一个数据框,然后lapply()在列表输出中使用。

问题是,我不知道如何始终在每个组中保留某个因素。请看下面的例子,它应该更清楚。

这是一个例子:

set.seed(555)
test_df <- data.frame(df_groups = sample(rep(x = c("x", "y", "z"), 10), 10))
split(test_df, test_df$df_groups)

输出:

> split(test_df, test_df$df_groups)
$x
  df_groups
1         x
4         x
7         x
8         x

$y
   df_groups
2          y
5          y
10         y

$z
  df_groups
3         z
6         z
9         z

好的,现在我想拆分数据框,但始终在每个组中保持“y”级别。输出应如下所示:

> split(test_df, test_df$df_groups)
    $x
      df_groups
    1          x
    4          x
    7          x
    8          x
    2          y
    5          y
    10         y
    
    $y
       df_groups
    2          y
    5          y
    10         y
    
    $z
      df_groups
    3          z
    6          z
    9          z
    2          y
    5          y
    10         y

标签: rsplit

解决方案


lapply您可以使用rbind您希望保留的特定组。

keep_val <- 'y'
keep_group <- subset(test_df, df_groups == keep_val)

lapply(split(test_df, test_df$df_groups), function(x) 
       if(x$df_groups[1] == keep_val) x else rbind(x, keep_group))

您也可以类似地使用purrr' -imap

purrr::imap(split(test_df, test_df$df_groups), 
             ~if(.y == keep_val) .x else rbind(.x, keep_group))

#$x
#   df_groups
#1          x
#4          x
#7          x
#8          x
#2          y
#5          y
#10         y

#$y
#   df_groups
#2          y
#5          y
#10         y

#$z
#   df_groups
#3          z
#6          z
#9          z
#2          y
#5          y
#10         y

推荐阅读