cca*_*ara 3 r dataframe dplyr splitstackshape
在对每个社区的感知问题进行调查后,我得到了这个数据帧.由于调查有不同的选择可供选择+一个开放的选项,因此公开问题的结果往往无关紧要(见下文):
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)))
Run Code Online (Sandbox Code Playgroud)
导致此数据框:
> 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
.. ... ... ...
>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,第9行之后的结果大多不相关(每个选项只有一个或两个响应者),所以我希望将它们分组到一个选项(例如"其他")而不会丢失它们与邻域的关系(这是为什么我现在无法重命名这些值.有什么建议?
该splitstackshape进口data.table包(所以你甚至不需要到library它)和分配data.table类数据集,所以我只想入手data.table语法从那里,特别是因为没有什么比data.table当它涉及到在一个子集的任务.
换句话说,这个长dplyr管道,你可以简单地做
df[, freq := .N / nrow(df) * 100 , by = Problems]
df[freq < 6, Problems := "OTHER"]
Run Code Online (Sandbox Code Playgroud)
你很高兴.
您可以使用检查新的摘要表
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
Run Code Online (Sandbox Code Playgroud)