【问题标题】:How can I summarize multiple string values by a column value in R?如何通过 R 中的列值汇总多个字符串值?
【发布时间】:2021-06-30 18:16:25
【问题描述】:

好的,所以这个问题并不像标题听起来那么简单。我有一个结构如下的表:

| Brand | First Name | Last Name | Amount  | e-mail              |
|-------|------------|-----------|---------|---------------------|
| A     | John       | Smith     | 920 USD | johnsmith@email.com |
| A     | Mary       | Smith     | 650 USD | johnsmith@email.com |
| A     | Margaret   | Smith     | 400 USD | johnsmith@email.com |
| B     | Eric       | Davis     | 120 USD | jdavis@email.com    |
| B     | Wanda      | Davis     | 500 USD | jdavis@email.com    |
| B     | Jean       | Davis     | 300 USD | jdavis@email.com    |
| A     | Daniel     | Barnes    | 400 USD | dbarnes@email.com   |

我最终要做的是生成要发送的电子邮件以通知客户他们的信用余额,在上面的示例中,我想向 johnsmith@email.com 发送一封电子邮件,内容类似于“您有品牌 A 的积分。约翰·史密斯有 920 美元,玛丽·史密斯有 650 美元,玛格丽特·史密斯有 400 美元。”

我不需要一直回答这个问题,但我想做的是为每封电子邮件设置一行,其中包含该电子邮件每一行的信息。也许某种生成的连接字段?理论上看起来很简单,但实际上我很难想出如何在 R 中准确地做到这一点。任何帮助都将不胜感激!

奖励:我对 MySQL 也有相当的经验,所以如果有更好的方法在 SQL 中完成,那就太好了!

编辑: Dput 输出(已编辑姓名和电子邮件)

structure(list(BRAND = c("R", "C", "C", "C", "C", "R", "R", "C", 
"C", "C"), GUEST_S_LAST_NAME = c("Stockman", "Ericson", "Ericson", 
"Alcin", "Andrews", "Smith", "Smith", "Brown", "Brown", "Brown"
), GUEST_S_FIRST_NAME = c("Margaret", "Abraham", "Naomi", "Dina", 
"Arthur", "Laura", "Alan", "Gregory", "Marina", "Viktoria"), 
    COMPENSATIONAMOUNT_OR_PERCENT = c("920 USD", "1363 USD", 
    "1363 USD", "452 USD", "452 USD", "250 USD", "250 USD", "1019 USD", 
    "1019 USD", "323 USD"), EXPIRATION_DATE = c("04/30/2022 12:00:00 00 am", 
    "12/31/2021 12:00:00 00 am", "12/31/2021 12:00:00 00 am", 
    "12/31/2021 12:00:00 00 am", "12/31/2021 12:00:00 00 am", 
    "04/30/2022 12:00:00 00 am", "04/30/2022 12:00:00 00 am", 
    "12/31/2021 12:00:00 00 am", "12/31/2021 12:00:00 00 am", 
    "12/31/2021 12:00:00 00 am"), EMAIL = c("email1@email.com", 
    "email2@email.com", "email2@email.com", "email3@email.com", 
    "email3@email.com", "email4@email.com", "email4@email.com", 
    "email5@email.com", "email5@email.com", "email5@email.com"
    )), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))

【问题讨论】:

    标签: mysql r data-manipulation


    【解决方案1】:

    这是我使用dplyr 的方法:

    library(dplyr)
    
    your_data %>%
      group_by(BRAND, EMAIL) %>%
      summarize(text = paste0(
        sprintf("You have credits with Brand %s. ", BRAND),
        paste(sprintf("%s %s has %s",
                      GUEST_S_FIRST_NAME,
                      GUEST_S_LAST_NAME,
                      COMPENSATIONAMOUNT_OR_PERCENT),
              collapse = ", "), "."))
    

    返回:

    # A tibble: 10 x 3
    # Groups:   BRAND, EMAIL [5]
       BRAND EMAIL         text                                                     
       <chr> <chr>         <chr>                                                    
     1 C     email2@email… You have credits with Brand C. Abraham Ericson has 1363 …
     2 C     email2@email… You have credits with Brand C. Abraham Ericson has 1363 …
     3 C     email3@email… You have credits with Brand C. Dina Alcin has 452 USD, A…
     4 C     email3@email… You have credits with Brand C. Dina Alcin has 452 USD, A…
     5 C     email5@email… You have credits with Brand C. Gregory Brown has 1019 US…
     6 C     email5@email… You have credits with Brand C. Gregory Brown has 1019 US…
     7 C     email5@email… You have credits with Brand C. Gregory Brown has 1019 US…
     8 R     email1@email… You have credits with Brand R. Margaret Stockman has 920…
     9 R     email4@email… You have credits with Brand R. Laura Smith has 250 USD, …
    10 R     email4@email… You have credits with Brand R. Laura Smith has 250 USD, …
    
    # Data used:
    your_data <- structure(list(BRAND = c("R", "C", "C", "C", "C", "R", "R", "C", "C", "C"), GUEST_S_LAST_NAME = c("Stockman", "Ericson", "Ericson", "Alcin", "Andrews", "Smith", "Smith", "Brown", "Brown", "Brown"), GUEST_S_FIRST_NAME = c("Margaret", "Abraham", "Naomi", "Dina", "Arthur", "Laura", "Alan", "Gregory", "Marina", "Viktoria"), COMPENSATIONAMOUNT_OR_PERCENT = c("920 USD", "1363 USD", "1363 USD", "452 USD", "452 USD", "250 USD", "250 USD", "1019 USD", "1019 USD", "323 USD"), EXPIRATION_DATE = c("04/30/2022 12:00:00 00 am", "12/31/2021 12:00:00 00 am", "12/31/2021 12:00:00 00 am", "12/31/2021 12:00:00 00 am", "12/31/2021 12:00:00 00 am", "04/30/2022 12:00:00 00 am", "04/30/2022 12:00:00 00 am", "12/31/2021 12:00:00 00 am", "12/31/2021 12:00:00 00 am", "12/31/2021 12:00:00 00 am"), EMAIL = c("email1@email.com", "email2@email.com", "email2@email.com", "email3@email.com", "email3@email.com", "email4@email.com", "email4@email.com", "email5@email.com", "email5@email.com", "email5@email.com")), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))
    

    【讨论】:

    • 哥们,我想我爱你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2017-03-22
    • 2022-01-16
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多