使用tidyR将数据从长格式转换为宽格式?

17

我有一个类似于这样的数据

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来实现它

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

但学习新知识总是好的。

4个回答

15

reshape代码紧凑,可用于多个值列。在tidyr中使用相同的代码可能需要几个步骤。使用gather将'宽'格式转换为'长'格式,以便有一个单独的'Val'列,unite 'Var'(从前一步骤)和'group'列以创建一个单独的'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
@jazzurro 我认为使用 dplyr 中的 ?select 可以获得更多的选项(例如 starts_with, ends_with, ....) - akrun
谢谢你的建议。我从现在开始会在gather()中应用选择选项。 - jazzurro

11

dcast 在 data.table v1.9.5+ 中可以处理多个 value.var 列。因此我们可以这样做:

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

基本上,无需熔化和铸造,而是直接浇注。您可以按照这些说明安装它。


5

自从 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软件包(v0.3.0)于2019-09-14创建。


0
df1 %>%
    gather(!c("name","group"), key="var" ,value="value") %>%
    unite(col='temp', c('var','group'), sep='.') %>%
    spread(temp, value=value)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接