[英]R condensing dataframe based on logic
我有一個看起來像這樣的數據集
dframe = data.frame(SiteCode = c(1,2,2,3,4,4),
SiteName= c('A','B','B','C','D','D'),
Revenue= c(100,200,200,550,700,700),
StrategicSite=c('Yes','No','No','No','Yes','Yes'),
Email=c('Yes','No','Yes','No','Yes','No'))
它包含 4 個客戶站點的信息,最后一列Email
確定是否應通過電子郵件向客戶發送促銷信息。
對於站點B
和D
,我想糾正一個異常情況。 他們的Email
列包含Yes
和No
。 我想編寫一個代碼,以便如果同一客戶端站點的Email
列中存在No
和Yes
狀態,則Email
列始終變為Yes
。 從而消除重復。
生成的 dataframe 看起來像這樣 -
desired_result = data.frame(SiteCode = c(1,2,3,4),
SiteName= c('A','B','C','D'),
Revenue= c(100,200,550,700),
StrategicSite=c('Yes','No','No','Yes'),
Email=c('Yes','Yes','No','Yes'))
我在嘗試中使用dplyr
,但它沒有給我我想要的東西
my_attempt = dframe %>% group_by(SiteCode,SiteName,Revenue,StrategicSite) %>%
mutate(Email = ifelse(Email=='Yes','Yes',Email))
對此的任何幫助將不勝感激。
您可以這樣做,但您應該在 mutate 中使用case_when()
,然后使用any(Email == "yes") as the condition. Finally,
any(Email == "yes") as the condition. Finally,
distinct()` 刪除重復項。
library(dplyr)
dframe %>%
group_by(SiteCode,SiteName,Revenue,StrategicSite) %>%
mutate(Email = case_when(any(Email == "Yes") ~ "Yes",
TRUE ~ "No")) %>%
distinct()
使用summarize
而不是mutate
:
dframe %>%
group_by(SiteCode, SiteName, Revenue, StrategicSite) %>%
summarize(Email = ifelse("Yes" %in% Email, 'Yes', Email)) %>%
ungroup()
# A tibble: 4 x 5
SiteCode SiteName Revenue StrategicSite Email
<dbl> <chr> <dbl> <chr> <chr>
1 1 A 100 Yes Yes
2 2 B 200 No Yes
3 3 C 550 No No
4 4 D 700 Yes Yes
這是使用unique
+ ave
的基本 R 選項
unique(within(dframe,Email <- ave(Email,SiteCode,SiteName,Revenue,StrategicSite,FUN = function(x) ifelse("Yes"%in%x,"Yes","No"))))
這使
SiteCode SiteName Revenue StrategicSite Email
1 1 A 100 Yes Yes
2 2 B 200 No Yes
4 3 C 550 No No
5 4 D 700 Yes Yes
帶有aggregate()
的base
R 解決方案。 它的優點是您可以使用"."
在公式中表示除Email
之外的所有列。
aggregate(Email ~ ., dframe, function(x) ifelse("Yes" %in% x, "Yes", "No"))
# SiteCode SiteName Revenue StrategicSite Email
# 1 2 B 200 No Yes
# 2 3 C 550 No No
# 3 1 A 100 Yes Yes
# 4 4 D 700 Yes Yes
這是另一種選擇
dframe %>% group_by(SiteCode,SiteName,Revenue,StrategicSite) %>%arrange(desc(Email))%>%filter(row_number()==1)%>%arrange(SiteName)
這將提供您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.