我有关于个人的不同学习策略的数据(存储在标记为StrategyA,StrategyB,StrategyC的栏中。这些策略的编码为1-15。我想为每个策略(例如,strategy1,strategy2等)创建一个虚拟对象学生最多可以列出3种策略。
示例数据
ID = c(1, 2, 3, 4, 5)
Strategy_A = c(10, 12, 13, 1, 2)
Strategy_B = c(1, 2, 1, 4, 5)
Strategy_C = c(2, 3, 6, 8, 15)
all = data.frame(ID, Strategy_A, Strategy_B, Strategy_C)
我考虑过使用apply并创建一个链接到fastDummies包的函数。
dummies = function(x){
dummy_cols(x)
}
new = apply(all [,-1], 2, dummies)
new = as.data.frame(new)
但是,这将为StrategyA_1 StrategyA_2 StrategyA_3创建虚拟对象,而不是将虚拟对象概括为Strategy1 Strategy2 Strategy3。有任何解决方法的想法吗?
答案 0 :(得分:1)
对server_name *.domain.test;
进行小幅转换后,您可以使用server_name .domain.test;
中的all
(也可以使用dummy.data.frame()
中的dummies
),然后使用{{1 }},每dummy_cols()
。
fastDummies
答案 1 :(得分:0)
我提供了一种tidyverse
方式的方法。
library(tidyverse)
new <- all %>% gather(select = -ID) %>%
mutate(key = NULL, num = 1) %>%
spread(value, num)
# ID 1 2 3 4 5 6 8 10 12 13 15
# 1 1 1 1 NA NA NA NA NA 1 NA NA NA
# 2 2 NA 1 1 NA NA NA NA NA 1 NA NA
# 3 3 1 NA NA NA NA 1 NA NA NA 1 NA
# 4 4 1 NA NA 1 NA NA 1 NA NA NA NA
# 5 5 NA 1 NA NA 1 NA NA NA NA NA 1
new[is.na(new)] <- 0
new
# ID 1 2 3 4 5 6 8 10 12 13 15
# 1 1 1 1 0 0 0 0 0 1 0 0 0
# 2 2 0 1 1 0 0 0 0 0 1 0 0
# 3 3 1 0 0 0 0 1 0 0 0 1 0
# 4 4 1 0 0 1 0 0 1 0 0 0 0
# 5 5 0 1 0 0 1 0 0 0 0 0 1