在对每个社区的感知问题进行调查后,我得到this dataframe。由于调查有不同的选择可供选择+一个开放的选项,因此公开问题的结果往往无关紧要(见下文):
library(dplyr)
library(splitstackshape)
df = read.csv("http://pastebin.com/raw.php?i=tQKHWMvL")
# Splitting multiple answers into different rows.
df = cSplit(df, "Problems", ",", direction = "long")
df = df %>%
group_by(Problems) %>%
summarise(Total = n()) %>%
mutate(freq = Total/sum(Total)*100) %>%
arrange(rank = desc(rank(freq)))
导致此数据框:
> df
Source: local data table [34 x 3]
Problems Total freq
1 Hurtos o robos sin violencia 245 25.6008359
2 Drogas 232 24.2424242
3 Peleas callejeras 162 16.9278997
4 Ningún problema 149 15.5694880
5 Agresiones 66 6.8965517
6 Robos con violencia 62 6.4785789
7 Quema contenedores 6 0.6269592
8 Ruidos 5 0.5224660
9 NS/NC 4 0.4179728
10 Desempleo 2 0.2089864
.. ... ... ...
>
正如您所看到的那样,第9行之后的结果大多不相关(每个选项只有一个或两个响应者),所以我希望将它们分组到一个选项中(例如"其他" )而不会失去与邻居的关系(这就是为什么我现在无法重命名这些值)。有什么建议吗?
答案 0 :(得分:6)
splitstackshape
导入data.table
包(因此您甚至不需要library
它)并为您的数据集分配data.table
类,因此我只是从那里继续data.table
语法,特别是因为当涉及子集中的赋值时,没有什么比data.table
更好。
换句话说,这个长dplyr
管道的内容,你可以简单地做
df[, freq := .N / nrow(df) * 100 , by = Problems]
df[freq < 6, Problems := "OTHER"]
你很高兴。
您可以使用
检查新摘要表df[, .(freq = .N/nrow(df) * 100), by = Problems][order(-freq)]
# 1: Hurtos o robos sin violencia 25.600836
# 2: Drogas 24.242424
# 3: Peleas callejeras 16.927900
# 4: Ningֳ÷n problema 15.569488
# 5: Agresiones 6.896552
# 6: Robos con violencia 6.478579
# 7: OTHER 4.284222