从R中的假人重建分类变量

问题描述 投票:0回答:2

Heyho,我是R的初学者,有一个问题,到目前为止我找不到解决方案。我想将虚拟变量转换回分类变量。

|dummy1| dummy2|dummy3|
|------| ------|------|
| 0    | 1     |0     |
| 1    | 0     |0     |
| 0    | 1     |0     |
| 0    | 0     |1     |

成:

|dummy |
|------|
|dummy2|
|dummy1|
|dummy2|
|dummy3|

你知道如何在R中做到这一点吗?提前致谢。

r dummy-variable reformatting
2个回答
0
投票

我们可以使用max.col

data.frame(dummy = names(df1)[max.col(df1)])
#    dummy
#1 dummy2
#2 dummy1
#3 dummy2
#4 dummy3

data

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))

0
投票

这是一个使用tidyversetidyr::gather解决方案。在这里,我们将key视为每个虚拟类别的变量,并将value视为存在/不存在。用0替换NAna.rm = TRUE中的gather意味着我们不会保留我们不想要的所有其他行,也不会创建一个不必要的大型中间数据集。

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创建于2018-03-06(v0.2.0)。

© www.soinside.com 2019 - 2024. All rights reserved.