转置数据帧

时间:2015-03-07 16:26:38

标签: r reshape2 tidyr

愉快的周末。

我一直在尝试复制R中此blog post的结果。我正在寻找一种不使用t转置数据的方法,最好使用tidyr或{{ 1}}。在下面的示例中,reshape是通过转置metadata获得的。

data

虽然它实现了我想要的东西,但我发现它并不那么不熟练。是否有任何有效的工作流程来转置数据框?

数据输入

metadata <- data.frame(colnames(data), t(data[1:4, ]) )
colnames(metadata) <- t(metadata[1,])
metadata <- metadata[-1,]
metadata$Multiplier <- as.numeric(metadata$Multiplier)

2 个答案:

答案 0 :(得分:27)

使用tidyrgather除了第一列之外的所有列,然后spread收集的列。

尝试:

library(dplyr)
library(tidyr)
data %>%
  gather(var, val, 2:ncol(data)) %>%
  spread(Series.Description, val)

答案 1 :(得分:1)

library(dplyr)
# Omitted data <- structure part ...

这里有一些内容复制了主要答案中的内容,但更通用(例如,在 Series.Description 不是结果的第一列的情况下工作)并使用较新的 pivot_wider/{{1} } 动词。

pivot_longer

但请注意(如上面的答案)第一列的名称丢失了。以下保留了这一点(我猜是上面@jbkunst 提出的 df_transpose <- function(df) { df %>% tidyr::pivot_longer(-1) %>% tidyr::pivot_wider(names_from = 1, values_from = value) } df_transpose(data) #> # A tibble: 26 x 5 #> name `Unit:` `Multiplier:` `Currency:` `Unique Identifi… #> <chr> <chr> <chr> <chr> <chr> #> 1 Nominal.Broad.Dollar.… Index:_19… 1 <NA> H10/H10/JRXWTFB_… #> 2 Nominal.Major.Currenc… Index:_19… 1 <NA> H10/H10/JRXWTFN_… #> 3 Nominal.Other.Importa… Index:_19… 1 <NA> H10/H10/JRXWTFO_… #> 4 AUSTRALIA....SPOT.EXC… Currency:… 1 USD H10/H10/RXI$US_N… #> 5 SPOT.EXCHANGE.RATE...… Currency:… 1 USD H10/H10/RXI$US_N… #> 6 NEW.ZEALAND....SPOT.E… Currency:… 1 USD H10/H10/RXI$US_N… #> 7 United.Kingdom....Spo… Currency:… 0.01 USD H10/H10/RXI$US_N… #> 8 BRAZIL....SPOT.EXCHAN… Currency:… 1 BRL H10/H10/RXI_N.M.… #> 9 CANADA....SPOT.EXCHAN… Currency:… 1 CAD H10/H10/RXI_N.M.… #> 10 CHINA....SPOT.EXCHANG… Currency:… 1 CNY H10/H10/RXI_N.M.… #> # … with 16 more rows 方法)。

spread_(names(data)[1], "val")

reprex package (v2.0.0) 于 2021 年 5 月 30 日创建