我是一个新的R用户,拥有一个调查数据集,该数据集要求受访者(以其ID为100,101,102和103的行表示)列出附近的常见犯罪和安全问题。这些事件的类型为Crime1-crime3,分布在各列中。我知道数据集组织得不好,但这是Google表单调查针对“选择所有适用”问题生成的输出的结构。
我想编写R代码来重新配置数据集,以便每种类型的犯罪/问题(例如,盗窃)都有自己的专栏。然后,可以将字符值替换为1。我手动重组了较大数据集的一小部分摘录,以显示所需的最终结果。任何建议将不胜感激!
最初,我尝试使用collect()将所有字符值收集到一列中,然后重新分配到新列中,但无法使其正常工作。
respondentID crime1 crime1 crime3
100 vandalism other 0
101 other 0 0
102 drugs theft other
103 drugs theft vandalism
respondentID drugs theft vandalism other
100 0 0 1 1
101 0 0 0 1
102 1 1 0 1
103 1 1 1 0
答案 0 :(得分:0)
首先,从宽到长转换:
df <- structure(list(respondentID = 100:103, crime1 = c("vandalism",
"other", "drugs", "drugs"), crime1.1 = c("other", "0", "theft",
"theft"), crime3 = c("0", "0", "other", "vandalism")),
class = "data.frame", row.names = c(NA,
-4L))
df_long <- df %>%
gather(key="crime_no", value="crime", -respondentID) %>%
select(-crime_no) %>%
filter(crime != "0")
说明:第一行加载您的数据(下次问问题时应使用dput
)。第二行转换为一种格式,每个犯罪一列。我们不需要“ crime_no”列,因为您对犯罪是1犯罪,2犯罪还是3犯罪都不感兴趣。最后,我们不需要0
犯罪(稍后我们将自动填写)。< / p>
现在,计算统计信息:
df_stat <- df_long %>% group_by(respondentID, crime) %>% summarise(n=n())
说明:虽然在您的示例数据中每个人仅犯一次罪行,但我认为这不是一般情况,有时您会看到其他数字。我们首先按受访者和犯罪对数据进行分组,然后我们对每种组合发生的次数进行计数。
并返回宽格式:
df_wide <- df_stat %>% spread(key=crime, value=n, fill=0)
说明:我们现在转换为“宽”格式,其中每种犯罪都有自己的专栏。我们使用参数fill=0
,因此,如果缺少数据(即某人未犯特定罪行),我们将插入0
而不是NA
。
这是您的结果:
respondentID drugs other theft vandalism
<int> <dbl> <dbl> <dbl> <dbl>
1 100 0 1 0 1
2 101 0 1 0 0
3 102 1 1 1 0
4 103 1 0 1 1
下次您提问题时,请
dput
,以便我们轻松加载您的示例数据