группировать фрейм данных или тиббл без записи цикла - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь сгруппировать значения.Мне нужно сгруппировать все отдельные значения в индексе в наименьшее количество групп, где столбец индекса не повторяется внутри группы.Я пытаюсь сделать это без петли.

дано:

# 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

Мне нужен результат

группа 1

# A tibble: 5 x 2
   barcode  index  
   <chr>    <chr>                      
 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

группа 3

# A tibble: 2 x 2
   barcode  index  
   barcode  index                      
   <chr>    <chr>                      
 3 XPO21500 a
 9 XPO21509 1

Любая идея о том, как я могу сделать это без создания явного цикла или применения к этому набору данных?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Не уверен насчет tidyverse, но простое решение для группировки нужным способом можно получить с помощью data.table

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

, это добавляет столбец группы к набору данных, которыйзатем можно использовать для извлечения различных групп

dat[group == 3]

В качестве альтернативы, если сохранение группы по какой-либо причине невозможно:

dat <- data.table(dat)
dat[,.(barcode, index, group = seq.int(.N)), by = index, on = index][group == 3]
0 голосов
/ 28 января 2019

Один из вариантов - создать последовательность по 'index', а затем split данные по 'grp', созданные

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

или с помощью base R, используйте ave длясоздайте последовательность и выполните split

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

data

df1 <- structure(list(barcode = c("XPO21451", "XPO21546", "XPO21500", 
 "XPO21454", "XPO21503", "XPO21457", "XPO21506", "XPO21460", "XPO21509", 
 "XPO21463"), index = c("a", "a", "a", "b", "c", "c", "1", "1", 
 "1", "2")), class = "data.frame", row.names = c("1", "2", "3", 
 "4", "5", "6", "7", "8", "9", "10"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...