将双重响应分成单独的因子级别

时间:2018-05-31 21:34:10

标签: r dataframe

我有一个数据框

DF <- data.frame(V1 = factor(c("Option 1", "Option 1", "Option 1, Option 2", "Option 2", "Option 2", "Option 1, Option 2")),
                  ID1 = factor(c("Resp1", "Resp1", "Resp3", "Resp4", "Resp5", "Resp6")))

我想将双重响应分开,这样我只有“选项1”和“选项2”级别,并且双重响应分配给两者。一种选择是重命名级别,然后使用separate_rows,但这非常耗费人力:

levels(DF$V1)
levels(DF$V1)[levels(DF$V1)=="Option 1"] <- "Option1"
levels(DF$V1)[levels(DF$V1)=="Option 2"] <- "Option2"
levels(DF$V1)[levels(DF$V1)=="Option 1, Option 2"] <- "Option1, Option2"
DF_result <- DF %>%
  separate_rows(V1) %>%
  mutate(V1 = factor(V1))
DF_result

有更简单的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以删除替换值的前几行(例如&#34;选项1&#34; - &gt;&#34;选项1&#34;),因为separate_rows需要{{1您可以设置为逗号的参数。由于您的某些值在&#34; Option&#34;之间有空格。和数字,有些没有,你可以删除所有空格来标准化他们 - 我使用sep,因为它很方便。然后用逗号分隔行,然后制作你的因子。

stringr::str_remove_all

答案 1 :(得分:1)

选项是首先应用library(tidyverse) DF %>% mutate(V1 = str_remove_all(V1, " ")) %>% separate_rows(V1, sep = ",") %>% mutate(V1 = as.factor(V1)) #> V1 ID1 #> 1 Option1 Resp1 #> 2 Option1 Resp1 #> 3 Option1 Resp3 #> 4 Option2 Resp3 #> 5 Option2 Resp4 #> 6 Option2 Resp5 #> 7 Option1 Resp6 #> 8 Option2 Resp6 ,然后使用tidyr::separate_rowsV1列中删除空格。请确保将gsub传递给sep = ","函数,以避免对separate_rows进行任何预处理。

V1