这里有一个使用tidyr::gather的整洁解决方案,将key视为每个虚拟变量所属类别的变量,value表示存在/不存在。 在gather中用NA替换0,并结合na.rm = TRUE意味着我们不保留不需要的所有其他行,并且不创建不必要的大型中间数据集。
df1 <- structure(list(dummy1 = c(0L, 1L, 0L, 0L), dummy2 = c(1L, 0L,
1L, 0L), dummy3 = c(0L, 0L, 0L, 1L), ed1 = c(1, 0, 1, 0), ed2 = c(0,
1, 0, 1), id = c(1, 2, 3, 4)), .Names = c("dummy1", "dummy2",
"dummy3", "ed1", "ed2", "id"), row.names = c(NA, -4L), class = "data.frame")
library(tidyverse)
df1 %>%
mutate_at(vars(dummy1:dummy3, ed1:ed2), ~ ifelse(. == 0, NA, .)) %>%
gather("dummy", "present", dummy1:dummy3, na.rm = TRUE) %>%
gather("ed", "present2", ed1:ed2, na.rm = TRUE) %>%
select(-present, -present2)
这段代码是在2018年3月6日使用reprex package (v0.2.0)创建的。
dummy
,即nm1 <- grep('dummy", names(df1), value = TRUE); nm1[max.col(df1[nm1])]
。 - akrun