2017-01-06 50 views
3

grepping为术语具有一个数据帧如下:组通过在柱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

感谢。平均值是否可能在分割的后半部分完成。我的号码似乎没有加起来 –

+0

啊哈。我认为这是因为NA。我想我只需要把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号码与后面的问题不匹配......是你的正确吗? –