使用R在数据集中的多个列之间重新分配字符值

时间:2019-07-16 06:37:47

标签: r

我是一个新的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

1 个答案:

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

下次您提问题时,请

  1. 使用dput,以便我们轻松加载您的示例数据
  2. 显示一些代码:您如何尝试自行解决问题?