tidyR 从长到宽的数据?

Posted

技术标签:

【中文标题】tidyR 从长到宽的数据?【英文标题】:Long to wide data with tidyR? 【发布时间】:2015-05-22 16:01:12 【问题描述】:

我的数据看起来像这样

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')

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

V1:V2 部分对我来说是新的。如果您键入 V1,那么您也在过滤数据。这很有用。 @jazzurro 我认为如果有更多选择,?select from dplyr 会很有用(即starts_with, ends_with, ....) 感谢您的提示。从现在开始,我将在gather() 中应用选择选项。【参考方案2】:

data.table v1.9.5+ 中的dcast 可以处理多个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即可安装。

【讨论】:

【参考方案3】:

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 创建

【讨论】:

【参考方案4】:
df1 %>%
    gather(!c("name","group"), key="var" ,value="value") %>%
    unite(col='temp', c('var','group'), sep='.') %>%
    spread(temp, value=value)

【讨论】:

以上是关于tidyR 从长到宽的数据?的主要内容,如果未能解决你的问题,请参考以下文章

从长到宽重塑并创建具有二进制值的列

在 R 中使用多个观察值从长到宽转换

使用熊猫将数据帧从长到宽转换-单行输出

熊猫从长到宽重塑,由两个变量

以特定方式转换为宽格式

从长数据帧到宽数组的快速转换