【问题标题】:Conditional Formatting of grouped Data in RR中分组数据的条件格式
【发布时间】:2018-12-04 03:53:20
【问题描述】:
UPRN    Start.Date  End.Date  Disability
1       2006-12-20 17-NOV-17         Y
1       2006-12-20 17-NOV-17         N
2       1991-12-06                   N
2       1991-12-06                   N
3       1991-04-29 2015-04-21        N
3       2015-04-22                   Y
4       2005-02-15                   Y
4       2005-02-15                   N

我有一个类似于上面的数据集(但要大得多)。我想创建一个名为 Any_Disability 的新列。

我想要这样做的方法是按 UPRN、Start.Date 和 End.Date 分组,如果该组中的任何行有残疾,那么两行的 Any_Disability 都会有一个“Y”。

我已经尝试过的是:

library(dplyr)

test3<-all_data%>%
  group_by(UPRN, Start.Date, End.Date)%>%
  mutate(Any_Disability = ifelse(Disability=="Y", "Y","N"))

但这不起作用,因为它给出了以下答案:

UPRN    Start.Date  End.Date  Disability  Any_Disability
1       2006-12-20 17-NOV-17         Y          Y
1       2006-12-20 17-NOV-17         N          N
2       1991-12-06                   N          N
2       1991-12-06                   N          N
3       1991-04-29 2015-04-21        N          N
3       2015-04-22                   Y          Y
4       2005-02-15                   Y          Y
4       2005-02-15                   N          N

可重现的代码:

UPRN<-c(1,1,2,2,3,3,4,4)
Start.Date<-c("2006-12-20","2006-12-20", "1991-12-06","1991-12-06","1991-04-29", "2015-04-22","2005-02-15", "2005-02-15")
End.Date<-c("17-NOV-17", "17-NOV-17", "","", "2015-04-21", "", "", "")
Disability<-c("Y","N","N","N","N","Y","Y","N")

dataset <- data.frame(UPRN, Start.Date, End.Date, Disability)

【问题讨论】:

    标签: r if-statement group-by dplyr


    【解决方案1】:

    我们可以使用any

    test3<-df%>%
         group_by(UPRN, Start.Date)%>%
         dplyr::mutate(Any_Disability = ifelse(any(Disability=="Y"), "Y","N"))
    test3
    # A tibble: 8 x 5
    # Groups:   UPRN, Start.Date [5]
       UPRN Start.Date   End.Date Disability Any_Disability
      <int>      <chr>      <chr>      <chr>          <chr>
    1     1 2006-12-20  17-NOV-17          Y              Y
    2     1 2006-12-20  17-NOV-17          N              Y
    3     2 1991-12-06       <NA>          N              N
    4     2 1991-12-06       <NA>          N              N
    5     3 1991-04-29 2015-04-21          N              N
    6     3 2015-04-22       <NA>          Y              Y
    7     4 2005-02-15       <NA>          Y              Y
    8     4 2005-02-15       <NA>          N              Y
    

    【讨论】:

    • 如果日期列是日期格式,这是否有效?
    • @MLPNPC 是的,它也适用于日期时间格式数据类型
    【解决方案2】:

    基础 R,使用 ave'Y' &gt; 'N' ... TRUE

    dataset_new <- within(dataset, 
        Any_Disability <- ave(Disability, paste0(UPRN, "#", Start.Date, "#", End.Date), 
            FUN = max)
        )
    
    # UPRN Start.Date   End.Date Disability Any_Disability
    #    1 2006-12-20  17-NOV-17          Y              Y
    #    1 2006-12-20  17-NOV-17          N              Y
    #    2 1991-12-06                     N              N
    #    2 1991-12-06                     N              N
    #    3 1991-04-29 2015-04-21          N              N
    #    3 2015-04-22                     Y              Y
    #    4 2005-02-15                     Y              Y
    #    4 2005-02-15                     N              Y
    

    你可以写FUN = function(x){if (any('Y' %in% x)) 'Y' else 'N'},而不是使用'Y' > 'N'技巧,同样的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多