R 分组数据帧或TIBLE而不写入循环

R 分组数据帧或TIBLE而不写入循环,r,tidyverse,R,Tidyverse,我正在尝试对价值观进行分组。我需要将索引中的所有不同值分组到尽可能少的组中,其中索引列在组中不重复。我试图做到这一点没有一个循环 鉴于: # A tibble: 10 x 2 barcode index <chr> <chr> 1 XPO21451 a 2 XPO21546 a 3 XPO21500 a 4 XPO21454 b 5 XPO21503 c

我正在尝试对价值观进行分组。我需要将索引中的所有不同值分组到尽可能少的组中,其中索引列在组中不重复。我试图做到这一点没有一个循环

鉴于:

# A tibble: 10 x 2
   barcode  index                      
   <chr>    <chr>                      
 1 XPO21451 a
 2 XPO21546 a
 3 XPO21500 a
 4 XPO21454 b
 5 XPO21503 c
 6 XPO21457 c
 7 XPO21506 1
 8 XPO21460 1
 9 XPO21509 1
10 XPO21463 2
#一个tible:10x2
条形码索引
1 XPO21451 a
2 XPO21546 a
3 XPO21500A
4 XPO21454 b
5 XPO21503 c
6 XPO21457 c
7 XPO21506 1
8 XPO21460 1
9 XPO21509 1
10 XPO21463 2
我需要一份调查结果

第一组

# A tibble: 5 x 2
   barcode  index  
   <chr>    <chr>                      
 1 XPO21451 a
 4 XPO21454 b
 5 XPO21503 c
 7 XPO21506 1
10 XPO21463 2
#一个tible:5 x 2
条形码索引
1 XPO21451 a
4 XPO21454 b
5 XPO21503 c
7 XPO21506 1
10 XPO21463 2
第2组

# A tibble: 3 x 2
   barcode  index  
   <chr>    <chr>                      
 2 XPO21546 a
 6 XPO21457 c
 8 XPO21460 1
#一个tible:3 x 2
条形码索引
2 XPO21546 a
6 XPO21457 c
8 XPO21460 1
第3组

# A tibble: 2 x 2
   barcode  index  
   barcode  index                      
   <chr>    <chr>                      
 3 XPO21500 a
 9 XPO21509 1
#一个tible:2x2
条形码索引
条形码索引
3 XPO21500A
9 XPO21509 1
你知道我如何在不创建显式循环或不应用于此数据集的情况下做到这一点吗


提前谢谢

一个选项是通过“索引”创建序列,然后通过创建的“grp”拆分数据

library(tidyverse)
df1 %>%
    group_by(index) %>% 
    mutate(grp = row_number()) %>%
    split(.$grp)

或者使用
base R
,使用
ave
创建序列并执行
拆分

grp <- with(df1, ave(seq_along(index), index, FUN = seq_along))
split(df1, grp)
#$`1`
#    barcode index
#1  XPO21451     a
#4  XPO21454     b
#5  XPO21503     c
#7  XPO21506     1
#10 XPO21463     2

#$`2`
#   barcode index
#2 XPO21546     a
#6 XPO21457     c
#8 XPO21460     1

#$`3`
#   barcode index
#3 XPO21500     a
#9 XPO21509     1

grp对tidyverse不太确定,但是可以使用data.table获得一个简单的分组解决方案

dat <- data.table(dat)
dat[,group := seq.int(.N), by = index, on = index]
或者,如果由于某种原因无法保存组:

dat <- data.table(dat)
dat[,.(barcode, index, group = seq.int(.N)), by = index, on = index][group == 3]

谢谢你。这正是我所需要的。由于我的数据集比我发送的数据集要复杂得多,我需要在多个列中分别执行此操作,然后拆分,因此我使用了上面的tidyverse示例,并使用了一些group by和mutates,然后对tidyr::unite()列进行了修改,并基于此进行拆分。帮个大忙!再次感谢!
dat[group == 3]
dat <- data.table(dat)
dat[,.(barcode, index, group = seq.int(.N)), by = index, on = index][group == 3]