将多个分类变换为二进制变量(R,tidyr)

时间:2017-03-03 09:18:35

标签: r dplyr tidyr

我目前正在尝试使用R中的tidyr包将多个分类变量转换为二进制编码。我有以下格式的数据:

mydata <- data.frame(type = c("tcp", "udp", "tcp", "tcp", "tcp"),
                     service = c("ftp", "other", "private", "http", "http"),
                     flag = c("SF", "SF", "S0", "SF", "SF"))

我希望为每种类型,服务和标志都有二进制编码。

我的第一次尝试如下:(基于Stackoverflow post

mydata %>% 
    select(type, service, flag) %>%
    mutate(ID = 1:nrow(.)) %>%
    gather(type, version, c(type, service, flag)) %>%
    mutate(present = 1) %>%
    select(-type) %>%
    spread(version, present, fill = 0)

似乎结果是正确的但是抛出了以下错误消息:

“测量变量的属性不相同;它们将被删除”

在第二次尝试中,我以非常糟糕的编码风格完成了它,但它运作正常:

mydata %>%
    select(type, service, flag) %>%
    mutate(type = 1, ID = 1:nrow(.))%>%
    distinct(ID, .keep_all = TRUE)  %>%
    spread(type, type, fill = 0) %>%
    mutate(type = 1) %>%
    distinct(ID, .keep_all = TRUE)  %>%
    spread(service, type, fill = 0) %>%
    mutate(type = 1) %>%
    distinct(ID, .keep_all = TRUE)  %>%
    spread(flag, type, fill = 0) %>%
    arrange(ID)

我真的更喜欢第一种解决方案,但我不确定内部发生了什么。而且由于我有一个非常庞大的数据集,如果一切正常,我无法查看每个条目。所以我的问题是:有人知道为什么会抛出错误信息以及如何解决问题?我更喜欢使用tidyr包的解决方案,但也非常欢迎其他提议!

0 个答案:

没有答案