tidyR的长数据到宽数据?

Ign*_*cio 13 r tidyr

我的数据看起来像这样

df = data.frame(name=c("A","A","B","B"),
                group=c("g1","g2","g1","g2"),
                V1=c(10,40,20,30),
                V2=c(6,3,1,7))
Run Code Online (Sandbox Code Playgroud)

我想重塑它看起来像这样:

df = data.frame(name=c("A", "B"),               
                V1.g1=c(10,20),
                V1.g2=c(40,30),
                V2.g1=c(6,1),
                V2.g2=c(3,7))
Run Code Online (Sandbox Code Playgroud)

用tidyR可以做到吗?

我可以用重塑来做到这一点

reshape(df, idvar='name', timevar='group', direction='wide')
Run Code Online (Sandbox Code Playgroud)

但是学习新东西总是好的.

akr*_*run 14

reshape代码是紧凑,它适用于多值列.使用相同的tidyr,可能需要几个步骤.转换"宽"格式"长"使用gather,以便将有一个单独的"瓦尔"列中,unite该"无功"(从之前的步骤)和"组"列建立一个单一"VARG"列,然后使用spread对将'long'重新转换为'wide'格式.

 library(tidyr)
 gather(df, Var, Val, V1:V2) %>% 
                    unite(VarG, Var, group) %>% 
                    spread(VarG, Val)
 #    name V1_g1 V1_g2 V2_g1 V2_g2
 #1    A    10    40     6     3
 #2    B    20    30     1     7
Run Code Online (Sandbox Code Playgroud)


Aru*_*run 9

dcast在data.table v1.9.5 +中可以处理多个value.var列.因此我们可以这样做:

require(data.table) # v1.9.5+
dcast(setDT(df), name ~ group, value.var=c("V1", "V2"))
#    name V1_g1 V1_g2 V2_g1 V2_g2
# 1:    A    10    40     6     3
# 2:    B    20    30     1     7
Run Code Online (Sandbox Code Playgroud)

基本上,不需要熔化和铸造,而是直接铸造.您可以按照这些说明进行安装.


Moo*_*per 5

tidyr 1.0.0开始,您可以执行以下操作:

library(tidyr)

df = data.frame(name=c("A","A","B","B"),
                group=c("g1","g2","g1","g2"),
                V1=c(10,40,20,30),
                V2=c(6,3,1,7))

pivot_wider(df, names_from = "group", values_from = c("V1", "V2"), names_sep = ".")
#> # A tibble: 2 x 5
#>   name  V1.g1 V1.g2 V2.g1 V2.g2
#>   <fct> <dbl> <dbl> <dbl> <dbl>
#> 1 A        10    40     6     3
#> 2 B        20    30     1     7
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2019-09-14 创建