Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将互不排斥的多个伪变量转换为单个类别变量,添加新行_R_Dummy Variable - Fatal编程技术网

R 将互不排斥的多个伪变量转换为单个类别变量,添加新行

R 将互不排斥的多个伪变量转换为单个类别变量,添加新行,r,dummy-variable,R,Dummy Variable,我有以下数据框: 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 <- 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"))
有人能告诉我如何做到这一点吗?

我们也可以使用data.table

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\u cols。但是,我不知道如何合并具有相同“id”和“task”的行。我希望格式与上面提供的格式相同,这样多个虚拟变量可以在每行中取1的值。有关此包中的反向操作,请参阅?tidy::pivot_。上的常见问题解答将提供几种不同方法的示例。
library(data.table)
melt(setDT(data), measure = patterns('^strategy'), 
     variable.name = 'strategy')[value == 1, .(id, task, strategy)]