使用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()
中的选择选项。