通过使用dplyr在列中使用术语进行分组

时间:2017-01-06 10:27:25

标签: r regex dplyr

我的数据框如下:

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。症状短语本身可以是任何东西,所以我不想特别搜索这些术语,而是在\n之前(或之间)任何术语

我想对每个症状的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)

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

2 个答案:

答案 0 :(得分:2)

我们可以使用cSplit

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

答案 1 :(得分: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