请考虑以下数据框:
> 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
进行数据拆分。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
不属于同一组,因为它们的首选项不同。我已经更新了数据集和预期结果。
答案 0 :(得分:1)
从您的预期输出中,您似乎需要捕获前两列(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
答案 1 :(得分:1)
您可以将primero
和segundo
放入向量中,然后对其进行排序(以使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