Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
从长表创建一个二进制宽表(如tidyr::spread())_R_Dplyr_Tidyr_Reshape2 - Fatal编程技术网

从长表创建一个二进制宽表(如tidyr::spread())

从长表创建一个二进制宽表(如tidyr::spread()),r,dplyr,tidyr,reshape2,R,Dplyr,Tidyr,Reshape2,作为树模型的输入,我用SQL创建了一个分析表。现在我想把它转移到R,因为有这个表作为输入的模型也在R中运行。 我无法将其中一个SQL步骤转换为R 分析表的格式如下: df <- data.frame( pseudonym = c("a", "a", "a", "b", "c", "c"), var1 = c(1,1,0,1,1,0), var2 = c(1,0,0,0,0,1), var3 = c(0,0,0,0,0,1)) > df pseudonym var

作为树模型的输入,我用SQL创建了一个分析表。现在我想把它转移到R,因为有这个表作为输入的模型也在R中运行。 我无法将其中一个SQL步骤转换为R

分析表的格式如下:

df <- data.frame(
  pseudonym = c("a", "a", "a", "b", "c", "c"),
  var1 = c(1,1,0,1,1,0),
  var2 = c(1,0,0,0,0,1),
  var3 = c(0,0,0,0,0,1))

> df
  pseudonym var1 var2 var3
1         a    1    1    0
2         a    1    0    0
3         a    0    0    0
4         b    1    0    0
5         c    1    0    0
6         c    0    1    1
如果有人有想法,这将非常有帮助。

这里有一种方法:

library(dplyr)
library(tidyr)

df <- data.frame(
  pseudonym = c("a", "a", "a", "b", "c", "c"),
  var1 = c(1,1,0,1,1,0),
  var2 = c(1,0,0,0,0,1),
  var3 = c(0,0,0,0,0,1))

df %>% 
  pivot_longer(cols = var1:var3) %>% 
  group_by(pseudonym, name) %>% 
  filter(max(value) == value) %>% 
  ungroup() %>% 
  distinct() %>% 
  pivot_wider(names_from = name, values_from = value)

#># A tibble: 3 x 4
#>  pseudonym  var1  var2  var3
#>  <fct>     <dbl> <dbl> <dbl>
#>1 a             1     1     0
#>2 b             1     0     0
#>3 c             1     1     1
库(dplyr)
图书馆(tidyr)
df%
枢轴长度(cols=var1:var3)%>%
分组人(笔名、姓名)%>%
过滤器(最大值)=值%>%
解组()%>%
不同的()%>%
枢轴(名称从=名称,值从=值)
#>#一个tibble:3x4
#>笔名var1 var2 var3
#>         
#>1A 110
#>2b100
#>3 c 1 1
另一种方法,可能不是很复杂,但很有效:

库(dplyr)
#> 
#>正在附加包:“dplyr”
#>以下对象已从“package:stats”屏蔽:
#> 
#>滤波器,滞后
#>以下对象已从“package:base”屏蔽:
#> 
#>相交、setdiff、setequal、并集
df笔名var1 var2 var3
#>1A 110
#>2 a 10 0
#>3 a 0 0 0
#>4b100
#>5C100
#>6c01
df2%group_by(化名)%%>%突变(var1=病例_时(1%in%var1~1),
var2=情况_(1%在%var2~1中),
var3=当(1%在%var3~1中))%>%
唯一()%%>%replace(is.na(.),0)%%>%
解组();df2
#>#tibble:3 x 4
#>笔名var1 var2 var3
#>          
#>1A 110
#>2b100
#>3 c 1 1

由(v0.3.0)于2020年4月21日创建

我们可以使用
max

library(data.table)
setDT(df)[, lapply(.SD, max), pseudonym]
#  pseudonym var1 var2 var3
#1:         a    1    1    0
#2:         b    1    0    0
#3:         c    1    1    1

当我在
mutate
语句中使用
case\u时,您可能能够使用
dplyr::case\u重现SQL,结果是df1。问题是我如何获得df2?
library(data.table)
setDT(df)[, lapply(.SD, max), pseudonym]
#  pseudonym var1 var2 var3
#1:         a    1    1    0
#2:         b    1    0    0
#3:         c    1    1    1