按首选项+考虑的选项分组

时间:2019-02-11 09:18:13

标签: r dataframe dplyr

请考虑以下数据框:

> 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

每行包含以下内容:primerosegundo,是由个人测试的产品; 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")

编辑

查看响应,我发现我对预期的输出不够清楚:

  • 应该对primerosegundo Pref进行数据拆分。
  • 给定的组 i 应当包含从相同的选择(Pref==Bprimero中选择了与首选产品相同的产品(例如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 :(得分:1)

从您的预期输出中,您似乎需要捕获前两列(primerosegundo)中的重复项。在这种情况下,您可以按行对条目进行排序,并使用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

答案 1 :(得分:1)

您可以将primerosegundo放入向量中,然后对其进行排序(以使A-B和B-A等效)并合并。然后只需拆分此变量+ 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