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

У меня есть фрейм данных, который выглядит следующим образом:

   cat        split_me       
   <chr>      <chr>          
 1 MVHYM7693B c(1, 7)        
 2 ZRRBS1363E c(2, 7, 18)    
 3 ZXYLV2407F 3              
 4 HXPPE8608M 4              
 5 JDARX0644Q c(5, 19)       
 6 HDBOK8136L 6              
 7 DCJPS0833K c(1, 2, 7, 18) 

Я могу использовать следующее для разделения данных:

splt <- to_split %>% 
  split(.$split_me)

, что дает мне список из 19 элементов. Однако исходные данные имели 20 элементов. Разделение, которое повторяется, разделяется c(5, 19). Как я могу проигнорировать это повторение и разделить c(5, 19) дважды?

Я хочу назвать разбиения в соответствии со столбцом cat в to_split Поэтому c(5, 19) будет иметь разные имена (JDARX0644Q) и(BZRXF3978Z).

Данные:

to_split <- structure(list(cat = c("MVHYM7693B", "ZRRBS1363E", "ZXYLV2407F", 
"HXPPE8608M", "JDARX0644Q", "HDBOK8136L", "DCJPS0833K", "UGDYS1458B", 
"ROQIP3617B", "HZMGG4347S", "EHESH8836T", "YGXZY0073I", "NMRDZ9798F", 
"WXBKD9937H", "JEMQK6388P", "QQMSV0889M", "IBMJM4467Q", "IOIDB2993Q", 
"BZRXF3978Z", "NJLNW3044Z"), split_me = c("c(1, 7)", "c(2, 7, 18)", 
"3", "4", "c(5, 19)", "6", "c(1, 2, 7, 18)", "8", "9", "10", 
"11", "12", "c(13, 18)", "14", "15", "16", "17", "c(2, 7, 13, 18)", 
"c(5, 19)", "20")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-20L))

РЕДАКТИРОВАТЬ:

Что я считаю лучшим для моих данных, это переупорядочить столбец split_me. На данный момент данные выглядят так:

# A tibble: 20 x 2
   cat        split_me       
   <chr>      <chr>          
 1 MVHYM7693B c(1, 7)        
 2 ZRRBS1363E c(2, 7, 18)    
 3 ZXYLV2407F 3              
 4 HXPPE8608M 4              
 5 JDARX0644Q c(5, 19)       
 6 HDBOK8136L 6              
 7 DCJPS0833K c(1, 2, 7, 18) 
 8 UGDYS1458B 8              
 9 ROQIP3617B 9              
10 HZMGG4347S 10             
11 EHESH8836T 11             
12 YGXZY0073I 12             
13 NMRDZ9798F c(13, 18)      
14 WXBKD9937H 14             
15 JEMQK6388P 15             
16 QQMSV0889M 16             
17 IBMJM4467Q 17             
18 IOIDB2993Q c(2, 7, 13, 18)
19 BZRXF3978Z c(5, 19)       
20 NJLNW3044Z 20

Здесь 1 в c(1, 7) соответствует строке 1 данных, а 7 соответствует строке 7. Я думаю, что я должен перестроить столбец так, чтобы:

строка 2 не изменилась. Т.е. c(2, 7, 18) - 2 является первым и поэтому не нуждается в изменении. Строка 5 также не изменяется, поскольку 5 в c(5, 19) является первой и соответствует номеру строки 5.

Строка 7 изменяется. Первоначально это c(1, 2, 7, 18), однако 7 является третьим в последовательности, я хочу переместить его в первый. Так что c(7, 1, 2, 18).

Строка 13 не меняется. Изменения строки 18 - исходный c(2, 7, 13, 18) требуемый вывод c(18, 2, 7, 13) Изменения строки 19 - исходный c(5, 19) требуемый вывод c(19, 5).

Это должно исправить проблему с дубликатами и проблемы, возникшие у меня позже с кодом. Например, я пытаюсь получить его так, чтобы для разбиений c(5, 19): данные, содержащиеся в 5, были бы arranged или выше данных в 19 (во фрейме данных). Тогда для split c(19, 5) данные в 19 будут выше данных в 5. (Надеюсь, это имеет смысл)

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

Вы можете split на основе столбца cat, который будет автоматически называть список с cat

split(to_split, to_split$cat)

В dplyr, что можно сделать с помощью group_split, но для этого потребуетсядобавить имена отдельно

library(dplyr)
to_split %>% group_split(cat) %>% setNames(to_split$cat) 
2 голосов
/ 05 ноября 2019

Вы можете попробовать вставить, а затем разделить, так что cat также будет включено, то есть

split(to_split, do.call(paste, to_split)) 

длиной 20,

length(split(to_split, do.call(paste, to_split)))
#[1] 20

Вот оно с dplyr method,

library(dplyr)

to_split %>% 
 group_by_all() %>% 
 group_split()

Имена после разделения do.call(...) имеют форму cat split_me. Чтобы назвать список только на основе вашей переменной cat, мы можем сделать следующее:

setNames(the_list_after_spliting, to_split$cat)

Однако, если у вас есть общие дубликаты,

setNames(the_list_after_spliting, 
         to_split$cat[!duplicated(do.call(paste,to_split))])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...