使用基于组的某些列中的条件,R个完整值

时间:2020-10-01 13:36:36

标签: r dplyr

我有一个像这样的数据集。

dataset = data.frame(SiteID= c(rep('1001',5),rep('1002',7),rep('1003',10),rep('1004',3)),
                     Site = c(rep('x',5),rep('w',7),rep('y',10),rep('z',3)),
                     Parent_Company = c(rep('NULL',2),rep('X LTD.',1),rep('X LTD.',2),rep('NULL',1),rep('W LTD.',6),rep('Y LTD.',8),rep('NULL',2),rep('Z LTD.',3)),
                     Country=c(rep('USA',5),rep('UK',7),rep('Japan',10),rep('Australia',3)),
                     Region=c(rep('NORAM',5),rep('UK&I',7),rep('ASIA',10),rep('OCEANIA',3)),
                     Audited= c(rep('Yes',3),rep('No',2),rep('Yes',6),rep('No',1),rep('Yes',10),rep('No',3)))

我正在尝试清理几列,即Parent_CompanyAudited。我正在寻找最有效的方法。

我想要实现的目标-

  1. 对于Parent_Company列-如果给定站点的Parent_Company列中至少有一个,而其余均为“ NULL”,则NULL值应替换为该值。如果没有值,只有'NULL',则什么也不能替换。

  2. 对于Audited列-如果给定站点在Audited列中至少有一个“是”,则所有其他值都必须为“是”。如果只有“否”,则什么都不会改变。

我的尝试

使用dplyr

library(dplyr)

    output = dataset %>%
      group_by(Site,SiteID,Country,Region) %>%
      mutate(Parent_Company = case_when(any(Parent_Company == "NULL") ~ Parent_Company,
                                       TRUE ~ "NULL")) %>%
      mutate(Audited = case_when(any(Audited == "Yes") ~ "Yes",
                                        TRUE ~ "No"))

似乎可用于Audited列。但不适用于Parent_Company。任何帮助将不胜感激。

我想要的输出

output = data.frame(SiteID= c(rep('1001',5),rep('1002',7),rep('1003',10),rep('1004',3)),
                     Site = c(rep('x',5),rep('w',7),rep('y',10),rep('z',3)),
                     Parent_Company = c(rep('X LTD.',5),rep('W LTD.',7),rep('Y LTD.',10),rep('Z LTD.',3)),
                     Country=c(rep('USA',5),rep('UK',7),rep('Japan',10),rep('Australia',3)),
                     Region=c(rep('NORAM',5),rep('UK&I',7),rep('ASIA',10),rep('OCEANIA',3)),
                     Audited= c(rep('Yes',5),rep('Yes',7),rep('Yes',10),rep('No',3)))

2 个答案:

答案 0 :(得分:1)

你很近。我认为您不需要case_when,如果您有多个条件,这将是合理的。 if_else足以满足Parent_Company的需求,坦率地说,标准if适用于Audited(使用“回收”,即,将值自动重复为所需的长度)向量)。

dataset %>%
  group_by(Site, SiteID, Country, Region) %>%
  mutate(
    Parent_Company = if_else(Parent_Company == "NULL" & any(Parent_Company != "NULL"),
                             Parent_Company[Parent_Company != "NULL"][1], Parent_Company),
    Audited = if (any(Audited == "Yes")) "Yes" else Audited
  ) %>%
  ungroup()
# # A tibble: 25 x 6
#    SiteID Site  Parent_Company Country Region Audited
#    <chr>  <chr> <chr>          <chr>   <chr>  <chr>  
#  1 1001   x     X LTD.         USA     NORAM  Yes    
#  2 1001   x     X LTD.         USA     NORAM  Yes    
#  3 1001   x     X LTD.         USA     NORAM  Yes    
#  4 1001   x     X LTD.         USA     NORAM  Yes    
#  5 1001   x     X LTD.         USA     NORAM  Yes    
#  6 1002   w     W LTD.         UK      UK&I   Yes    
#  7 1002   w     W LTD.         UK      UK&I   Yes    
#  8 1002   w     W LTD.         UK      UK&I   Yes    
#  9 1002   w     W LTD.         UK      UK&I   Yes    
# 10 1002   w     W LTD.         UK      UK&I   Yes    
# # ... with 15 more rows

如果您确实想要case_when(例如,某个特定列的条件比您在此处说明的要多,那么:

dataset %>%
  group_by(Site, SiteID, Country, Region) %>%
  mutate(
    Parent_Company = case_when(
      Parent_Company == "NULL" & any(Parent_Company != "NULL") ~ Parent_Company[Parent_Company != "NULL"][1],
      TRUE ~ Parent_Company),
    Audited = case_when(
      Audited != "Yes" & any(Audited == "Yes") ~ "Yes",
      TRUE ~ Audited)
  ) %>%
  ungroup()
# # A tibble: 25 x 6
#    SiteID Site  Parent_Company Country Region Audited
#    <chr>  <chr> <chr>          <chr>   <chr>  <chr>  
#  1 1001   x     X LTD.         USA     NORAM  Yes    
#  2 1001   x     X LTD.         USA     NORAM  Yes    
#  3 1001   x     X LTD.         USA     NORAM  Yes    
#  4 1001   x     X LTD.         USA     NORAM  Yes    
#  5 1001   x     X LTD.         USA     NORAM  Yes    
#  6 1002   w     W LTD.         UK      UK&I   Yes    
#  7 1002   w     W LTD.         UK      UK&I   Yes    
#  8 1002   w     W LTD.         UK      UK&I   Yes    
#  9 1002   w     W LTD.         UK      UK&I   Yes    
# 10 1002   w     W LTD.         UK      UK&I   Yes    
# # ... with 15 more rows

答案 1 :(得分:0)

Parent_Company无法成功,因为您告诉R如果Parent_Company == NULL,那么它应该采用Parent_Company的值,但是哪一个呢?它将仅对每一行使用该行的Parent_Company值,因此您将获得与原来相同的值

要解决此问题,您可以改写:

dataset %>% group_by(Site,SiteID,Country,Region) %>%
  mutate(
    Parent_Company = case_when(any(!is.null(Parent_Company)) ~ .$Parent_Company[1]),
    Audited = case_when(any(Audited == "Yes") ~ "Yes",  TRUE ~ "No")
    )

含义:当组中的任何Parent_Company不为NULL时,则将第一个Parent_Company值应用于所有值(假设所有Parent_Company值相同; NULL将被删除在任何列表中,因此将不使用它)。 / p>

相关问题