分组数据中的子集数据框

Subsetting dataframe in grouped data

我有一个数据框,其中包含一列因子,在按因子级别分组后,我希望每第 n 行将其子集化为 select。例如,

my_df <- data.frame(col1 = c(1:12), col2 = rep(c("A","B", "C"), 4))
my_df
  col1 col2
1     1    A
2     2    B
3     3    C
4     4    A
5     5    B
6     6    C
7     7    A
8     8    B
9     9    C
10   10    A
11   11    B
12   12    C

每第 2 行子集 select 应产生 my_new_df 作为,

  col1 col2
1    4    A
2   10    A
3    5    B
4   11    B
5    6    C
6   12    C

我在 dplyr 中试过:

my_df %>% group_by(col2) %>%
my_df[seq(2, nrow(my_df), 2), ] -> my_new_df

我得到一个错误:

Error: Can't subset columns that don't exist.
x Locations 4, 6, 8, 10, and 12 don't exist.
ℹ There are only 2 columns.

为了查看nrow函数是否有问题,我尝试直接使用数字。所以,

my_df %>% group_by(col2) %>%
   my_df[seq(2, 4, 2), ] -> my_new_df

也报错了,

Error: Can't subset columns that don't exist.
x Location 4 doesn't exist.
ℹ There are only 2 columns.
Run `rlang::last_error()` to see where the error occurred.

我的期望是它会运行对每组数据进行子集化,然后将它们组合成'my_new_df'。我对 group_by 工作原理的理解显然是错误的,但我一直在思考如何克服这个错误。任何帮助将不胜感激。

尝试:

my_df %>%
  group_by(col2)%>%
  slice(seq(from = 2, to = n(), by = 2))

# A tibble: 6 x 2
# Groups:   col2 [3]
   col1 col2 
  <int> <chr>
1     4 A    
2    10 A    
3     5 B    
4    11 B    
5     6 C    
6    12 C   

如果你想做其他不基于 col2 的操作,你可能想在切片后取消分组。

这里有一个data.table选项:

library(data.table)
data <- as.data.table(my_df)

data[(rowid(col2) %% 2) == 0]

   col1 col2
1:    4    A
2:    5    B
3:    6    C
4:   10    A
5:   11    B
6:   12    C

或基数 R:

my_df[as.logical(with(my_df, ave(col1, col2, FUN = function(x) 
  seq_along(x) %% 2 == 0))), ]

   col1 col2
4     4    A
5     5    B
6     6    C
10   10    A
11   11    B
12   12    C