【问题标题】:Grouping data based on a condition (containing a specific string)根据条件对数据进行分组(包含特定字符串)
【发布时间】:2021-12-21 12:18:38
【问题描述】:

我有一个与此类似的数据集:

年份 |身份证 |类型
2000 1 O
2000 1 O
2000 1 O
2000 1 O
2000 1 R
2017年5月
2017年5月
2000 8转
2000年8月
2002年8月

我想创建一个代码,按年份和 ID 对数据进行分组(我想它会使用 Dplyr)但它需要有一个条件:如果在给定年份有任何类型 R 与 ID 关联,那么我希望它选择R型。如果它只有O型,那么输出一定是O。

示例:
年份 |身份证 |类型
2000 1 R
2017年5月
2000 8转
2002年8月

谢谢大家

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以在逻辑向量上执行arrangeTRUE 按字母顺序在FALSE 之后)和slice 分组后的第一行

    library(dplyr)
    df1 %>% 
       arrange(Year, ID, Type == 'O') %>%
       group_by(Year, ID) %>%
       slice_head(n = 1) %>%
       ungroup
    

    -输出

    # A tibble: 4 × 3
       Year    ID Type 
      <int> <int> <chr>
    1  2000     1 R    
    2  2000     5 O    
    3  2000     8 R    
    4  2002     8 O    
    

    或者在arrange 之后使用distinct,它返回第一个非重复行

    df1 %>%
        arrange(Year, ID, Type == 'O') %>%
        distinct(Year, ID, .keep_all = TRUE)
    

    -输出

     Year ID Type
    1 2000  1    R
    2 2000  5    O
    3 2000  8    R
    4 2002  8    O
    

    数据

    df1 <- structure(list(Year = c(2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
    2000L, 2000L, 2000L, 2002L), ID = c(1L, 1L, 1L, 1L, 1L, 5L, 5L, 
    8L, 8L, 8L), Type = c("O", "O", "O", "O", "R", "O", "O", "R", 
    "O", "O")), class = "data.frame", row.names = c(NA, -10L))
    

    【讨论】:

    • 成功了!非常感谢
    • 你知道我如何计算每年R型的百分比吗?示例输出表将转换为: Year Percent 2000 0.66 2002 0
    • @PortoCrl 您可以在帖子中添加预期的内容吗? cmets 不清楚
    • @PortoCrl 你需要df1 %&gt;% group_by(Year) %&gt;% summarise(Percent = mean(Type == 'R'))
    • 没错。你是最棒的 :) 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多