【问题标题】:Converting multiple dummy variables that are not mutually exclusive into single categorical variable, adding new rows将不互斥的多个虚拟变量转换为单个分类变量,添加新行
【发布时间】:2020-08-11 03:37:33
【问题描述】:

我有以下数据框:

data <- data.frame(id=c(1, 1, 2, 2), 
task=c(1, 2, 1, 2),
strategy1=c("1", "1", "0", "1"),
strategy2=c("0", "0", "1", "1"),
strategy3=c("0", "1", "0", "1"))

我的目标是将不同策略的虚拟变量组合成一个分类变量“策略”。如果参与者在一项任务中使用了多种策略,则必须相应地创建具有相同“id”和“任务”编号的新行,因为应该只有一个“策略”变量。

对于给定的示例,数据框最终应如下所示:

data_single <- data.frame(id=c(1, 1, 1, 2, 2, 2, 2),
task=c(1, 2, 2, 1, 2, 2, 2),
strategy=c("1", "1", "3", "2", "1", "2", "3"))

谁能告诉我如何做到这一点?

【问题讨论】:

    标签: r dummy-variable


    【解决方案1】:
    library(tidyr)
    library(dplyr)
    tidyr::pivot_longer(
      data, 
      cols = starts_with("strategy"),
      names_prefix = "strategy", 
      names_to = "strategy"
    ) %>%
      filter(value == 1) %>%
      select(-value)
    # # A tibble: 7 x 3
    #      id  task strategy
    #   <dbl> <dbl> <chr>   
    # 1     1     1 1       
    # 2     1     2 1       
    # 3     1     2 3       
    # 4     2     1 2       
    # 5     2     2 1       
    # 6     2     2 2       
    # 7     2     2 3  
    

    【讨论】:

    • 谢谢,这很好用。我将如何完成相反的操作(从一个分类变量到多个虚拟变量)?我试过使用 fastDummies::dummy_cols。但是,我不知道如何合并具有相同“id”和“任务”的行。我希望格式类似于上面提供的格式,这样多个虚拟变量的每行可以取值为 1。
    • 请参阅?tidy::pivot_wider 了解此包中的逆运算。 reshaping data from long to wide 上的常见问题解答将提供几种不同方法的示例。
    【解决方案2】:

    我们也可以使用data.table

    library(data.table)
    melt(setDT(data), measure = patterns('^strategy'), 
         variable.name = 'strategy')[value == 1, .(id, task, strategy)]
    

    【讨论】:

      猜你喜欢
      • 2013-04-14
      • 1970-01-01
      • 2021-01-01
      • 2020-11-28
      • 2020-08-02
      • 1970-01-01
      • 2020-05-13
      • 2021-06-11
      • 2018-03-22
      相关资源
      最近更新 更多