2017-01-06 1 views
3

У меня есть dataframe следующим образом:Группа по оглавлению терминов в колонке с 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

Мы можем использовать cSplit

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

Спасибо. Возможно ли, что Avg выполняется только для второй половины раскола. Мои цифры, похоже, не складываются –

+0

Aha. Я думаю, что это из-за НС. Наверное, мне просто нужно положить na.rm = T –

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 
+0

@SebastianZeki номер не соответствует Back Back ... правильно? –