我目前正在尝试使用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包的解决方案,但也非常欢迎其他提议!