Группировка по предпочтению + рассмотренные варианты - PullRequest
0 голосов
/ 11 февраля 2019

Рассмотрим следующий кадр данных:

> A
  primero segundo Pref comentario
1       A       B    B   bavodkzn
2       B       A    B   tgczxobh
3       B       C    B   wavkflpr
4       C       A    C   ujplgzkh
5       A       C    C   hfsnrdaq
6       A       B    A       asdf

Каждая строка содержит следующее: primero и segundo, которые являются продуктами, протестированными отдельным лицом;Pref, который является предпочтительным вариантом для указанного лица, и comentario, в котором содержится комментарий, сделанный этим человеком.
Для моего анализа я забочусь только о предпочтительном продукте и двух протестированных ими продуктах ( не заказ).Таким образом, ожидаемый результат будет:

> Group_1
  primero segundo Pref comentario
1       A       B    B   bavodkzn
2       B       A    B   tgczxobh
> Group 2
  primero segundo Pref comentario
3       B       C    B   wavkflpr
> Group 3
  primero segundo Pref comentario
4       C       A    C   ujplgzkh
5       A       C    C   hfsnrdaq
> Group 4
 primero segundo Pref comentario
6       A       B    A       asdf

Это можно сделать с помощью циклов, но я бы предположил, что существуют более простые решения, возможно, через dplyr.

dput изданные:

structure(list(primero = c("A", "B", "B", "C", "A", "A"), segundo = c("B", 
"A", "C", "A", "C", "B"), Pref = c("B", "B", "B", "C", "C", "A"
), comentario = c("bavodkzn", "tgczxobh", "wavkflpr", "ujplgzkh", 
"hfsnrdaq", "asdf")), row.names = c(NA, -6L), class = "data.frame")

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

Глядя на ответ, я вижу, что я недостаточно ясно дал понять, каков ожидаемый результат:

  • Данные должны быть разбиты по primero, segundo и Pref.
  • В данной группе i должны быть лица, которые выбралитот же продукт, что и предпочтительный (например, Pref==B) из того же выбора (primero и segundo), независимо от порядка двух последних.

Таким образом,

  primero segundo Pref comentario
1       A       B    B   bavodkzn
2       B       A    B   tgczxobh

Должны ли все принадлежать к одной группе, в то время как

  primero segundo Pref comentario
6       A       B    A       asdf

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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вы можете поместить primero и segundo в вектор, затем отсортировать их (чтобы сделать AB и BA эквивалентными) и конкатанатировать.Затем просто разделите эту переменную + переменная Pref:

library(tidyverse)

A %>%
  as_tibble() %>%
  mutate(x = map2_chr(primero, segundo, ~c(.x, .y) %>% sort() %>% str_c(collapse = ', '))) %>%
  split(list(.$x, .$Pref)) %>%
  map(~select(.x, -x)) %>%
  `[`(map_lgl(., ~nrow(.x) > 0))

Вывод:

$`A, B.A`
# A tibble: 1 x 4
  primero segundo Pref  comentario
  <chr>   <chr>   <chr> <chr>     
1 A       B       A     asdf      

$`A, B.B`
# A tibble: 2 x 4
  primero segundo Pref  comentario
  <chr>   <chr>   <chr> <chr>     
1 A       B       B     bavodkzn  
2 B       A       B     tgczxobh  

$`B, C.B`
# A tibble: 1 x 4
  primero segundo Pref  comentario
  <chr>   <chr>   <chr> <chr>     
1 B       C       B     wavkflpr  

$`A, C.C`
# A tibble: 2 x 4
  primero segundo Pref  comentario
  <chr>   <chr>   <chr> <chr>     
1 C       A       C     ujplgzkh  
2 A       C       C     hfsnrdaq  
0 голосов
/ 11 февраля 2019

Судя по ожидаемому выводу, вам нужно поймать дубликаты из первых двух столбцов (primero и segundo).В этом случае вы можете отсортировать записи по строкам и использовать duplicated для создания групп, т.е.

cumsum(!duplicated(apply(A[c(1,2)], 1, function(i) toString(sort(i)))))
#[1] 1 1 2 3 3

Чтобы применить и разбить (если необходимо) исходный фрейм данных,

v1 <- cumsum(!duplicated(apply(A[c(1,2)], 1, function(i) toString(sort(i)))))
split(A, v1)

, что дает,

$`1`
  primero segundo Pref comentario
1       A       B    B   bavodkzn
2       B       A    B   tgczxobh

$`2`
  primero segundo Pref comentario
3       B       C    B   wavkflpr

$`3`
  primero segundo Pref comentario
4       C       A    C   ujplgzkh
5       A       C    C   hfsnrdaq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...