簡體   English   中英

R 冷凝 dataframe 基於邏輯

[英]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確定是否應通過電子郵件向客戶發送促銷信息。

對於站點BD ,我想糾正一個異常情況。 他們的Email列包含YesNo 我想編寫一個代碼,以便如果同一客戶端站點的Email列中存在NoYes狀態,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM