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

时间:2015-07-24 11:47:05

标签: r dataframe dplyr splitstackshape

在对每个社区的感知问题进行调查后,我得到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行之后的结果大多不相关(每个选项只有一个或两个响应者),所以我希望将它们分组到一个选项中(例如"其他" )而不会失去与邻居的关系(这就是为什么我现在无法重命名这些值)。有什么建议吗?

1 个答案:

答案 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