【问题标题】:Group by grepping for terms in a column with dplyr使用 dplyr 对列中的术语进行 grepping 分组
【发布时间】:2017-05-21 02:17:08
【问题描述】:

我有一个如下的数据框:

Symptom                                          number        

Abdominal pain\n Swallowing probs\n Back issues\n       22
Abdominal pain\n                                        12
Back issues \n Vomiting \n                                 14
Back issues\n                                            5

每个症状短语的末尾总是有一个\n。症状短语本身可以是任何字面意思,所以我不想专门搜索这些术语,而是在\n987654323@

之前(或之间)的任何术语

我想对每种症状的 number 进行平均,这样我最终得到:

Symptom                       Avg
Abdominal pain                 17
Swallowing probs               22
Back issues                    20.5
Vomiting                       14

我不知道如何使用 dplyr 按单个术语进行分组。我试过了

SypmAvg<- df %>% group_by(grepl("(?\\n.*\\n)|($.*?\\n)",df$Symptom)%>% summarise(mean=mean(number)

但它只会让我的电脑崩溃,所以我什至看不到错误。任何人都可以帮忙吗?这只是一个正则表达式问题还是有更好的方法来做到这一点?

【问题讨论】:

    标签: r regex dplyr


    【解决方案1】:
    library(dplyr)
    df1 = df %>% group_by(id) %>% mutate(new_col = strsplit(Symptom, "\n")) %>% unnest()
    
    df1 %>% group_by(trimws(new_col)) %>% summarise( ans = mean(number))
    
    # new_col   ans
    # 1   Abdominal pain 17.00000
    # 2      Back issues 13.66667
    # 3 Swallowing probs 22.00000
    # 4         Vomiting 14.00000
    

    【讨论】:

    • @SebastianZeki 号码与过往问题不匹配...您的号码正确吗?
    【解决方案2】:

    我们可以使用cSplit

    library(splitstackshape)
    cSplit(df, "Symptom", "\\n", "long")[, .(Avg = mean(number)), .(Symptom)]
    

    【讨论】:

    • 谢谢。是否有可能只是在拆分的后半段完成平均。我的数字似乎没有加起来
    • 啊哈。我认为这是因为 NA 的。我想我只需要输入 na.rm=T
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2016-10-09
    • 2015-08-13
    • 2018-09-26
    • 2018-03-24
    • 2020-09-24
    相关资源
    最近更新 更多