代码之家  ›  专栏  ›  技术社区  ›  Student

在R中使用apply创建假人

  •  1
  • Student  · 技术社区  · 7 年前

    我有关于个人不同学习策略的数据(存储在标有StrategyA、StrategyB、StrategyC的列中)。策略编码为1-15。我想为每个策略(例如策略1、策略2等)创建一个虚拟对象,因为每个学生最多可以列出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)
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   nghauran    7 年前

    all dummy.data.frame() 从…起 dummies dummy_cols() 从…起 fastDummies aggregate ID

    all <- data.frame(ID = rep(all$ID, 3),
                      Strategy = c(all$Strategy_A, all$Strategy_B, all$Strategy_C)) # data frame "all" with one column Strategy
    library(dummies)
    all <- dummy.data.frame(all, "Strategy") # or fastDummies::dummy_cols(all, "Strategy")
    aggregate(. ~ ID, all, sum) # since strategies are now dummies, the sum will always be 0 or 1
    # output
      ID Strategy1 Strategy2 Strategy3 Strategy4 Strategy5 Strategy6 Strategy8 Strategy10 Strategy12 Strategy13 Strategy15
    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
    
        2
  •  0
  •   Darren Tsai    7 年前

    我提供了一个 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
    
    推荐文章