使用 tidyR 从长到宽的数据?
Long to wide data with 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,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')
但是学习新东西总是好的。
reshape
代码紧凑,因为它适用于多个值列。在 tidyr
中使用相同的方法可能需要几个步骤。使用 gather
将 'wide' 格式转换为 'long',这样就会有一个 'Val' 列,unite
'Var'(来自上一步)和 'group' 列来创建单个 '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
dcast
in data.table v1.9.5+ 可以处理多个 value.var
列。因此我们可以这样做:
library(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
基本上不用熔铸,直接铸造。您可以按照 these instructions.
安装它
从 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
由 reprex package (v0.3.0)
创建于 2019-09-14
df1 %>%
gather(!c("name","group"), key="var" ,value="value") %>%
unite(col='temp', c('var','group'), sep='.') %>%
spread(temp, value=value)
我有这样的数据
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')
但是学习新东西总是好的。
reshape
代码紧凑,因为它适用于多个值列。在 tidyr
中使用相同的方法可能需要几个步骤。使用 gather
将 'wide' 格式转换为 'long',这样就会有一个 'Val' 列,unite
'Var'(来自上一步)和 'group' 列来创建单个 '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
dcast
in data.table v1.9.5+ 可以处理多个 value.var
列。因此我们可以这样做:
library(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
基本上不用熔铸,直接铸造。您可以按照 these instructions.
安装它从 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
由 reprex package (v0.3.0)
创建于 2019-09-14df1 %>%
gather(!c("name","group"), key="var" ,value="value") %>%
unite(col='temp', c('var','group'), sep='.') %>%
spread(temp, value=value)