将不相关/类似的观察结果合并为一个(其他)

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行之后的结果大多不相关(每个选项只有一个或两个响应者),所以我希望将它们分组到一个选项(例如"其他")而不会丢失它们与邻域的关系(这是为什么我现在无法重命名这些值.有什么建议?

Dav*_*urg 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"]
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)