dplyr 使用条件值 AND OR 进行变异以创建组类别

问题描述 投票:0回答:1

我有一个数据集,其中有一个名为“个体”的变量,有很多选项,就像这样。 我对某一天对不同个体 (Individual_ID) 的观察结果

个人的不同选择如下: individual_ID("Adele", "Fitz", "Abba")...这些将属于 Group=A 的组 individual_ID("Noir", "Rouge", "Bleue")...这些将属于一个名为 Group=B

的组

在某些情况下,来自不同群体的个体可能会混合在一起,所以我们有这样的东西 individual_ID("Adele", "Rouge", "Bleue")...所以这代表一个混合组,

我想创建一个名为 GroupingID 的变量,它可以是 GroupA、GroupB 或 MixedGroup 为此,我并不精确地说该群体中的所有个人都在场,而是指出个人的代表相对于他们的群体来说是整齐的还是不整齐的。

为了考虑混合分组,任何涉及至少两个来自不同组的个体的组合就足够了。

有人可以解释一下如何在 mutate 中应用条件 AND/OR 来创建变量分组吗?

这是我的数据的样子

Date      IndividualsObserved    
1/1/2016   Abba,Adele
2/1/2016   Adele,Fitz
3/1/2016   Fitz,Rouge,Noir
4/1/2016   Fitz,Adele,Abba
5/1/2016   Rouge,Noir,Bleue
6/1/2016   Rouge,Abba,Fitz

(在“IndividualsObserved”列的每个输入单元格中,不同的个体以逗号分隔)

所以我希望有一个分组类别,能够辨别分组是否整齐(只有一个群体标识,或者分组是否由来自不同群体的个体混合组成)。 会是这样的(GroupingID)

Date      IndividualsObserved   GroupingID
1/1/2016   Abba,Adele           GroupA
2/1/2016   Adele,Fitz           GroupA
3/1/2016   Fitz,Rouge,Noir      MixedGrouping
4/1/2016   Fitz,Adele,Abba      GroupA
5/1/2016   Rouge,Noir,Bleue     GroupB
6/1/2016   Rouge,Abba,Fitz      MixedGrouping
7/1/2016   Noir,Bleue,Abba      MixedGrouping

我尝试过但没有成功:

  mutate(GroupingID = case_when(IndividualsObserved %in% c("Adele","Abba", "Fitz") ~ "GroupA",
                                IndividualsObserved %in% c("Noir","Bleue", "Rouge") ~ "GroupB",
                                TRUE ~ ToCheck)) 

如果您对如何使用 mutate 选项来解决此问题有任何见解,我将不胜感激,

我尝试使用 dplyr 函数 mutate

r dplyr case categorical-data mutate
1个回答
0
投票
library(tidyverse)

groups <- list("A" = c("Adele", "Fitz", "Abba"),
               "B" = c("Rouge", "Noir", "Bleue"))

df |>
  mutate(IndividualsObserved = str_split(IndividualsObserved, ","),
         Group = map_chr(IndividualsObserved, \(x) {
            a <- any(x %in% groups$A)
            b <- any(x %in% groups$B)
            case_when(a & b ~ "MixedGrouping",
                      a ~ "GroupA",
                      b ~ "GroupB",
                      TRUE ~ "None")}))

输出:

      Date IndividualsObserved         Group
1 1/1/2016         Abba, Adele        GroupA
2 2/1/2016         Adele, Fitz        GroupA
3 3/1/2016   Fitz, Rouge, Noir MixedGrouping
4 4/1/2016   Fitz, Adele, Abba        GroupA
5 5/1/2016  Rouge, Noir, Bleue        GroupB
6 6/1/2016   Rouge, Abba, Fitz MixedGrouping
7 7/1/2016   Noir, Bleue, Abba MixedGrouping

数据:

df <- read.table(text= 
"Date      IndividualsObserved
1/1/2016   Abba,Adele
2/1/2016   Adele,Fitz
3/1/2016   Fitz,Rouge,Noir
4/1/2016   Fitz,Adele,Abba
5/1/2016   Rouge,Noir,Bleue
6/1/2016   Rouge,Abba,Fitz
7/1/2016   Noir,Bleue,Abba", header = T)
© www.soinside.com 2019 - 2024. All rights reserved.