gpt4 book ai didi

r - 从开放式问卷中汇总和映射观察结果

转载 作者:行者123 更新时间:2023-12-01 08:13:26 24 4
gpt4 key购买 nike

总结

我想创建一个像这样的箱线图,显示城市每个街区最常见的问题。 Sample boxplot with real data

不幸的是,箱线图是无用的,因为我使用的数据来自一个公开的调查问卷,它有两个主要问题:

  1. 有很多不相关的答案(不相关是指那些只有一个或少数人使用的答案)
  2. 有些问题涉及相同的概念,但措辞不同,因此被视为不同的问题。

为了使其更有用,我想将不相关的答案汇总到一个组中“例如:other problems 并重命名意思相同的问题,以便它们的措辞准确,从而可以在条形图中正确显示。不幸的是,我没有成功。

详细解释

让我们看一个示例代码(dataframe 上的名称只是示例:为了清楚起见,我对它们进行了修改,以便更容易理解两个或多个问题是相关的,但实际术语可以'总是从正则表达式中推导出来):

library(plyr)
library(dplyr)
library(tidyr)

df= read.csv("http://pastebin.com/raw/bUxANQw6")

problems = df %>%
select(Problems) %>%
gather(variable, value) %>%
group_by(value) %>%
summarise(Total = n()) %>%
arrange(desc(Total))

这导致以下数据框:

> problems
Source: local data frame [27 x 2]

value Total
1 Problem 1 282
2 Problem 3 268
3 Problem 2 186
4 No problems 160
5 Problem 4 76
6 Problem 5 68
7 Problem 6 6
8 Problem 7 5
9 Doesn't know 4
10 Problem 8 2
.. ... ...
>

可以看出我们有 27 个问题,仔细观察它们我们可以建立一些组:

  1. 相关数据:问题 1 到 7 + No ProblemsDoesn't know
  2. 同义词:我们有 Problem 9 , Problem 9' , Problem 9''Problem 9''' (除其他外)
  3. 不相关的数据,应归入一个标签下,例如“其他问题”:问题 12 到 18

我建议的方法

为了克服这两个问题,我认为我可以这样做:

为了处理同义词,我想到将同义词值重命名为一个,可能使用revalue。命令,像这样:

df$Problems = revalue(df$Problems, c('Problem 9’' = 'Problem 9',
'Problem 9’’' = 'Problem 9',
'Problem 9’’’' = 'Problem 9'))

然而,作为一个 R 新手(以及编程语言的新手),我认为应该有一种更快的方法来实现这一点,因为维护“同义词字典”的任务将非常乏味并且会越来越多当收到更多回复时。

为了处理不相关的答案,我可以采用类似的方法,并将它们重估为 Other problems ,但我想以自动化的方式进行,因为随着调查问卷尚未完成,不相关术语的列表将会增加,我无法手动映射所有这些术语(例如:映射所有投票的值少于5 人 Total < 5 )。我想我应该创建一个函数并使用控制结构 ( for ... in ),但我还没有成功。

由于我需要显示按社区分组的答案箱线图,恐怕我不能使用 problems数据框原样。因此,尽管计算每个问题的总票数很有用,但除了将其用作信息数据外,我不知道如何处理它。另一方面,我无法仅根据每个社区收到的回复来确定答案是否不相关,因为这会使结果产生偏差,因为预计不同的社区可能有不同的问题。

如果您能帮助解决这两个问题,我们将不胜感激。谢谢

最佳答案

我看了你的数据和代码。你的数据框,problems得到 Problem 9’ , Problem 7'等等。所以你想要的是删除 ' .那是你的任务之一。您可以使用以下行完成此任务。

problems$value <- gsub(pattern = "’+|'+", replacement = "", x = problems$value)

您可以使用 which() 完成其他任务.您想要查找 Total < 5 的行.使用 which() ,你可以找到索引。然后,您替换 value 中的任何内容在 Other problems 的行中.我希望这就是您所追求的。

problems$value[which(problems$Total < 5)] <- "Other problems"

数据

problems <- structure(list(value = c("Problem 1", "Problem 3", "Problem 2", 
"No problems", "Problem 4", "Problem 5", "Problem 6", "Problem 7",
"Doesn't know", "Problem 8", "Problem 9", "Problem 9’", "Other problems",
"Problem 10", "Problem 10’", "Problem 11", "Problem 11'", "Problem 12",
"Problem 13", "Problem 14", "Problem 15", "Problem 16", "Problem 17",
"Problem 18", "Problem 7'", "Problem 9’’", "Problem 9’’’"
), Total = c(282L, 268L, 186L, 160L, 76L, 68L, 6L, 5L, 4L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-27L), .Names = c("value", "Total"))

编辑

看到OP的第一条评论,以下几行将制作一个数据框来绘制图形。

count(df, Neighborhoods, Problems) -> temp

temp$Problems <- gsub(pattern = "’+|'+", replacement = "", x = temp$Problems)

temp$Problems[which(temp$n < 5)] <- "Other problems"

group_by(temp, Neighborhoods, Problems) %>%
summarize(Total = sum(n)) -> temp2

关于r - 从开放式问卷中汇总和映射观察结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35813805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com