使用tidyR从长到宽的数据?

使用tidyR从长到宽的数据?,r,tidyr,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)) 我想把它改造成这样: df = data.frame(name=c("A", "B"), V1.g1=c(10,2

我有这样的数据

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))
我想把它改造成这样:

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))
有可能用tidyR做吗

我可以用整形来做

reshape(df, idvar='name', timevar='group', direction='wide')

但是学习新的东西总是很好。

重塑
代码非常紧凑,因为它适用于多值列。在
tidyr
中使用相同的方法可能需要几个步骤。使用
collect
将“宽”格式转换为“长”格式,这样将有一个单独的“Val”列,
unite
将“Var”(来自上一步)和“group”列转换为一个单独的“VarG”列,然后使用
spread
将“long”格式重新转换为“宽”格式

 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

data.table v1.9.5+中的
dcast
可以处理多个
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
基本上,不需要熔化和浇铸,而是直接浇铸。您可以通过以下方式安装它。

自tidyr 1.0.0以来,您可以执行以下操作:

library(tidyr)
df=data.frame(name=c(“A”、“A”、“B”、“B”),
组=c(“g1”、“g2”、“g1”、“g2”),
V1=c(10,40,20,30),
V2=c(6,3,1,7))
枢轴宽度(df,name_from=“group”,value_from=c(“V1”,“V2”),name_sep=“.”)
#>#A tible:2 x 5
#>名称V1.g1 V1.g2 V2.g1 V2.g2
#>       
#>1 A 10 40 6 3
#>2B203017

由(v0.3.0)于2019-09-14创建的V1:V2部件对我来说是新的。如果您键入V1,您也在筛选数据。这很有用。@jazzurro我想更多的选项,
?从
dplyr
中选择
会很有用(即
以…开始,以…结束)
谢谢你的提示。从现在起,我将应用
gather()
中的选择选项。