3

在对每个社区的感知问题进行调查后,我得到了这个数据框。由于该调查有不同的选项可供选择 + 一个开放式的,因此开放式问题的结果通常是不相关的(见下文):

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 行之后的结果大多是不相关的(每个选项只有一个或两个受访者),所以我希望将它们分组为一个选项(例如“其他”),而不会失去与邻里的关系(即为什么我现在不能重命名这些值)。有什么建议么?

4

1 回答 1

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
于 2015-07-24T12:11:57.120 回答