愉快的周末。
我一直在尝试复制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)
答案 0 :(得分:27)
使用tidyr
,gather
除了第一列之外的所有列,然后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 日创建