【问题标题】:dummy variable columns based on strings from other columns [duplicate]基于来自其他列的字符串的虚拟变量列[重复]
【发布时间】:2019-11-27 20:55:27
【问题描述】:

我有一个数据库,其中包含患者 ID 号和他们接受的治疗。我想为每种不同的个体治疗(即,患者接受治疗 A、B、C、D)都有一个虚拟列。

这很简单,因为我有超过 20 种治疗方法和数千名患者,但我想不出一个简单的方法来做到这一点。

example <- data.frame(id_number = c(0, 1, 2, 3, 4), 
                      treatment = c("A", "A+B+C+D", "C+B", "B+A", "C"))

我想要这样的东西:

desired_result <- data.frame(id_number = c(0, 1, 2, 3, 4), 
                             treatment = c("A", "A+B+C+D", "C+B", "B+A","C"),
                             A=c(1,1,0,1,0), 
                             B=c(0,1,1,1,0),
                             C=c(0,1,1,0,1),
                             D=c(0,1,0,0,0))

【问题讨论】:

    标签: r function dplyr dummy-variable


    【解决方案1】:

    base 版本:

    example["A"] <- as.numeric(grepl("A", example[,"treatment"]))
    example["B"] <- as.numeric(grepl("B", example[,"treatment"]))
    example["C"] <- as.numeric(grepl("C", example[,"treatment"]))
    example["D"] <- as.numeric(grepl("D", example[,"treatment"]))
    
    example
    
      id_number treatment A B C D
    1         0         A 1 0 0 0
    2         1   A+B+C+D 1 1 1 1
    3         2       C+B 0 1 1 0
    4         3       B+A 1 1 0 0
    5         4         C 0 0 1 0
    

    grepl 函数测试每行中每个模式的存在,as.numeric 将逻辑 TRUE/FALSE 更改为 1/0

    【讨论】:

      【解决方案2】:

      tidyverse 的一种可能是:

      example %>%
       mutate(treatment2 = strsplit(treatment, "+", fixed = TRUE)) %>%
       unnest() %>%
       spread(treatment2, treatment2) %>%
       mutate_at(vars(-id_number, -treatment), ~ (!is.na(.)) * 1)
      
        id_number treatment A B C D
      1         0         A 1 0 0 0
      2         1   A+B+C+D 1 1 1 1
      3         2       C+B 0 1 1 0
      4         3       B+A 1 1 0 0
      5         4         C 0 0 1 0
      

      或者:

      example %>%
       mutate(treatment2 = strsplit(treatment, "+", fixed = TRUE)) %>%
       unnest() %>%
       mutate(val = 1) %>%
       spread(treatment2, val, fill = 0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-31
        • 2022-07-31
        • 2021-02-28
        • 2018-07-15
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        相关资源
        最近更新 更多