【问题标题】:In dplyr groups, how can I select a group that has a combination of a specific value with only ONE other of multiple values在 dplyr 组中,我如何选择一个组合了一个特定值与多个值中只有一个的组合
【发布时间】:2019-05-30 19:40:05
【问题描述】:

我有一个看起来像这样的数据集

Group  Company
1      A
1      XX
1      A
1      XX
2      XX
2      A
2      XX
2      B
3      B
3      B
3      XX
3      A
4      C
4      C
4      XX
4      XX

它实际上更大,有更多的列、行和值,但我现在要解决的问题涉及这两列。

现在,我想要实现的是,对于每个 Group,用以下方式替换 Company

如果 XX 与任何其他唯一公司值一起存在于组中,则应将公司替换为该唯一值。像这样:

Group  Company
1      A
1      XX
1      A
1      XX

应该变成:

Group  Company
1      A
1      A
1      A
1      A

如果任何 Group 包含 2 个以上的 Company 唯一值,包括“XX”,则该组的 Company 值应保持不变,像这样:

Group  Company
2      XX
2      A
2      XX
2      B

我正在尝试使用 dplyr 来实现这一点,但我设法做到了我想要的,但只有 Company 的一个值,如下所示:

result <- df%>%
group_by(Group) %>%
mutate(final = ifelse(Company %in% c("A", "XX"), 1,2)) %>% 
summarize(test = mean(final))

result$final <- ifelse(result$test== 1, "A", result$Company)

我可以通过循环来做到这一点,但我很确定这不是最好的方法。

有没有用 dplyr 做到这一点的干净方法? (当然也欢迎其他解决方案)

最终的数据框将如下所示:

Group  Company
1      A
1      A
1      A
1      A
2      XX
2      A
2      XX
2      B
3      B
3      B
3      XX
3      A
4      C
4      C
4      C
4      C

感谢大家的宝贵时间。

【问题讨论】:

    标签: r dplyr combinations


    【解决方案1】:

    这是dplyr的一种方式 -

    df %>%
      group_by(Group) %>%
      mutate(
        Company = case_when(
                    ("XX" %in% Company) && (n_distinct(Company) == 2) ~ Company[Company != "XX"][1], 
                    TRUE ~ Company
                  )
      ) %>% 
      ungroup()
    
    # A tibble: 16 x 2
       Group Company
       <int> <chr>  
     1     1 A      
     2     1 A      
     3     1 A      
     4     1 A      
     5     2 XX     
     6     2 A      
     7     2 XX     
     8     2 B      
     9     3 B      
    10     3 B      
    11     3 XX     
    12     3 A      
    13     4 C      
    14     4 C      
    15     4 C      
    16     4 C 
    

    【讨论】:

    • 谢谢你,这个效果很好!我需要更多练习额外的 dplyr 动词。能否请您解释第二个条件:TRUE ~ 公司?
    • 任何不满足条件 1 的都由第二个条件处理,因为第二个条件默认设置为 TRUE。在这种情况下,当条件 1 不满足时,公司价值保持不变。
    • 对!我在考虑 if_else 语句的术语。就是这样……确实如此:)非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-04-19
    • 2011-05-27
    • 1970-01-01
    • 2013-05-22
    • 2021-11-26
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多