R:将具有多个值的列分隔为单独的二进制列

时间:2018-03-25 12:19:09

标签: r binary tidyr separator

我的数据集中的列相当凌乱。 它是一个名为Themes的列,位于不同项目的数据集中。

共有10个不同的主题,所有主题都以随机顺序混乱 图像:My messy column

我要做的是,为每个主题创建一个列,其中0(=项目不包含主题)或1(=项目确实包含主题),是否为特定项目/ row包含主题。

FX。请参阅图片:My wished output

我试图做的是单独使用:

Themes_split <- Merge %>%
               separate(Themes, into = c("CP", "CG", 
                      "Edu", "Health", "Nut", "Ill", "Liv", "Hum", 
                      "Cross-Thematic", "Non-Thematic"), sep = ",", 
                       na.rm=TRUE)

但是这个输出无法识别列中列出主题的随机顺序,请参阅输出图像:My actual output

如何让R识别不同的主题,并在特定项目包含不同主题时为新列指定值0或1?

我期待着一些帮助 - 谢谢

1 个答案:

答案 0 :(得分:0)

您尚未向我们提供themes数据。但是,请查看tidyr::separate_rows帮助示例。您可以根据您的示例进行调整:

df <- data.frame(
  x = 1:3,
  y = c("a", "d,e,f", "g,h"),
  z = c("1", "2,3,4", "5,6"),
  stringsAsFactors = FALSE
)

> df
  x     y     z
1 1     a     1
2 2 d,e,f 2,3,4
3 3   g,h   5,6

separate_rows(df, y, z, convert = TRUE)

  x y z
1 1 a 1
2 2 d 2
3 2 e 3
4 2 f 4
5 3 g 5
6 3 h 6

您可以通过进一步传播数据来修改它:

separate_rows(df, y, z, convert = TRUE) %>% spread(y, z, fill= 0)
  x a d e f g h
1 1 1 0 0 0 0 0
2 2 0 2 3 4 0 0
3 3 0 0 0 0 5 6