我有一个像这样的数据集。
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_Company
和Audited
。我正在寻找最有效的方法。
我想要实现的目标-
对于Parent_Company
列-如果给定站点的Parent_Company
列中至少有一个值,而其余均为“ NULL”,则NULL值应替换为该值。如果没有值,只有'NULL',则什么也不能替换。
对于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)))
答案 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>