使用R中的傻瓜创建假人

时间:2018-11-12 16:12:09

标签: r apply

我有关于个人的不同学习策略的数据(存储在标记为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。有任何解决方法的想法吗?

2 个答案:

答案 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