我的数据看起来像这样
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)
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)
基本上,不需要熔化和铸造,而是直接铸造.您可以按照这些说明进行安装.
从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 创建