从 R 中的虚拟变量重建分类变量
Reconstruct a categorical variable from dummies in R
嘿嘿,
我是 R 的初学者,有一个问题,到目前为止我找不到解决方案。我想将虚拟变量转换回分类变量。
|dummy1| dummy2|dummy3|
|------| ------|------|
| 0 | 1 |0 |
| 1 | 0 |0 |
| 0 | 1 |0 |
| 0 | 0 |1 |
进入:
|dummy |
|------|
|dummy2|
|dummy1|
|dummy2|
|dummy3|
你知道如何在 R 中做到这一点吗?提前致谢。
我们可以使用max.col
data.frame(dummy = names(df1)[max.col(df1)])
# dummy
#1 dummy2
#2 dummy1
#3 dummy2
#4 dummy3
数据
df1 <- structure(list(dummy1 = c(0L, 1L, 0L, 0L), dummy2 = c(1L, 0L,
1L, 0L), dummy3 = c(0L, 0L, 0L, 1L)), .Names = c("dummy1", "dummy2",
"dummy3"), class = "data.frame", row.names = c(NA, -4L))
这是一个 tidyverse
解决方案,使用 tidyr::gather
。这里我们将 key
视为每个 dummy 所属类别的变量,并将 value
视为 presence/absence。将 0
替换为 NA
并结合 gather
中的 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)
#> id dummy ed
#> 2 1 dummy2 ed1
#> 3 3 dummy2 ed1
#> 5 2 dummy1 ed2
#> 8 4 dummy3 ed2
由 reprex package (v0.2.0) 创建于 2018-03-06。
您可以使用 data.table
id_cols = c("x1", "x2")
data.table::melt.data.table(data = dt, id.vars = id_cols,
na.rm = TRUE,
measure = patterns("dummy"))
示例:
t = data.table(dummy_a = c(1, 0, 0), dummy_b = c(0, 1, 0), dummy_c = c(0, 0, 1), id = c(1, 2, 3))
data.table::melt.data.table(data = t,
id.vars = "id",
measure = patterns("dummy_"),
na.rm = T)[value == 1, .(id, variable)]
输出
id variable
1: 1 dummy_a
2: 2 dummy_b
3: 3 dummy_c
如果你用 NA 重新填充 0 会更容易,所以 na.rm = TRUE in melt 将用 NA
删除每一行
嘿嘿, 我是 R 的初学者,有一个问题,到目前为止我找不到解决方案。我想将虚拟变量转换回分类变量。
|dummy1| dummy2|dummy3|
|------| ------|------|
| 0 | 1 |0 |
| 1 | 0 |0 |
| 0 | 1 |0 |
| 0 | 0 |1 |
进入:
|dummy |
|------|
|dummy2|
|dummy1|
|dummy2|
|dummy3|
你知道如何在 R 中做到这一点吗?提前致谢。
我们可以使用max.col
data.frame(dummy = names(df1)[max.col(df1)])
# dummy
#1 dummy2
#2 dummy1
#3 dummy2
#4 dummy3
数据
df1 <- structure(list(dummy1 = c(0L, 1L, 0L, 0L), dummy2 = c(1L, 0L,
1L, 0L), dummy3 = c(0L, 0L, 0L, 1L)), .Names = c("dummy1", "dummy2",
"dummy3"), class = "data.frame", row.names = c(NA, -4L))
这是一个 tidyverse
解决方案,使用 tidyr::gather
。这里我们将 key
视为每个 dummy 所属类别的变量,并将 value
视为 presence/absence。将 0
替换为 NA
并结合 gather
中的 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)
#> id dummy ed
#> 2 1 dummy2 ed1
#> 3 3 dummy2 ed1
#> 5 2 dummy1 ed2
#> 8 4 dummy3 ed2
由 reprex package (v0.2.0) 创建于 2018-03-06。
您可以使用 data.table
id_cols = c("x1", "x2")
data.table::melt.data.table(data = dt, id.vars = id_cols,
na.rm = TRUE,
measure = patterns("dummy"))
示例:
t = data.table(dummy_a = c(1, 0, 0), dummy_b = c(0, 1, 0), dummy_c = c(0, 0, 1), id = c(1, 2, 3))
data.table::melt.data.table(data = t,
id.vars = "id",
measure = patterns("dummy_"),
na.rm = T)[value == 1, .(id, variable)]
输出
id variable
1: 1 dummy_a
2: 2 dummy_b
3: 3 dummy_c
如果你用 NA 重新填充 0 会更容易,所以 na.rm = TRUE in melt 将用 NA
删除每一行