如何使用索引用 dplyr 重组非常宽的数据帧?
How to restructure very wide dataframes with dplyr using an index?
我在 gather
上阅读了很多帖子,但我正在努力创建一个解决方案,将不同宽度的文件重组为长格式。
我的数据在这里:
library(RCurl)
x <- getURL("https://raw.githubusercontent.com/bac3917/Cauldron/master/jazz.csv")
df2 <- read.csv(text = x)
在上面的例子中,我有一组 3 列,每列都需要堆叠起来。我尝试了以下方法,但我的值分散到错误的列中:
longJazz<- df2 %>% gather(key,
value,
X1:X69)
生成的数据框应该有 782 行和 3 列(标题、年份和艺术家)。
在另一种情况下,我有一组 5 列,所以我想要一个可以简单调整的解决方案。例如,一个将数据框和每组列数作为参数的函数会很方便。
我们可以删除第一列 'X',然后按照 'Details'、'year'、[= 的顺序重命名列,直到最后一列 'id' 19=],然后使用 tidyr
中的 pivot_longer
重塑为 'long' 格式
library(stringr)
library(dplyr)
library(readr)
library(tidyr)
df2 <- df2[-1]
i1 <- as.integer(gl(ncol(df2)-1, 3, ncol(df2)-1))
names(df2)[1:69] <- str_c(c("Details", "year", "Description"), i1, sep="_")
df2 %>%
mutate_at(vars(starts_with('year')), ~ as.integer(as.character(.))) %>%
pivot_longer(cols = -id, names_sep="_", names_to = c(".value", "group")) %>%
select(-group)
# A tibble: 1,150 x 4
# id Details year Description
# <int> <fct> <int> <fct>
# 1 1 Sophisticated Lady / Tea For Two 1933 Art Tatum
# 2 1 The Genius Of Art Tatum, No. 21 1955 Art Tatum
# 3 1 The Tatum Group Masterpieces, Vol. 5 1964 Art Tatum / Lionel Hampton / Harry Edison / Buddy Rich / Red Callender / Barney Ke…
# 4 1 Live Sessions 1940 / 1941 1975 Art Tatum
# 5 1 20th Century Piano Genius 1986 Art Tatum
# 6 1 Jazz Masters (100 Ans De Jazz) 1998 Art Tatum
# 7 1 The Art Tatum - Ben Webster Quartet 2015 Art Tatum / Ben Webster
# 8 1 El Gran Tatum NA Art Tatum
# 9 1 Sweet Georgia Brown / Shiek Of Araby / Back O' Town Bl… 1945 Benny Goodman Quintet* / Esquire All Stars Featuring Louis Armstrong
#10 1 The Immortal Live Sessions 1944/1947 1975 Louis Armstrong
# … with 1,140 more rows
我在 gather
上阅读了很多帖子,但我正在努力创建一个解决方案,将不同宽度的文件重组为长格式。
我的数据在这里:
library(RCurl)
x <- getURL("https://raw.githubusercontent.com/bac3917/Cauldron/master/jazz.csv")
df2 <- read.csv(text = x)
在上面的例子中,我有一组 3 列,每列都需要堆叠起来。我尝试了以下方法,但我的值分散到错误的列中:
longJazz<- df2 %>% gather(key,
value,
X1:X69)
生成的数据框应该有 782 行和 3 列(标题、年份和艺术家)。
在另一种情况下,我有一组 5 列,所以我想要一个可以简单调整的解决方案。例如,一个将数据框和每组列数作为参数的函数会很方便。
我们可以删除第一列 'X',然后按照 'Details'、'year'、[= 的顺序重命名列,直到最后一列 'id' 19=],然后使用 tidyr
中的 pivot_longer
重塑为 'long' 格式
library(stringr)
library(dplyr)
library(readr)
library(tidyr)
df2 <- df2[-1]
i1 <- as.integer(gl(ncol(df2)-1, 3, ncol(df2)-1))
names(df2)[1:69] <- str_c(c("Details", "year", "Description"), i1, sep="_")
df2 %>%
mutate_at(vars(starts_with('year')), ~ as.integer(as.character(.))) %>%
pivot_longer(cols = -id, names_sep="_", names_to = c(".value", "group")) %>%
select(-group)
# A tibble: 1,150 x 4
# id Details year Description
# <int> <fct> <int> <fct>
# 1 1 Sophisticated Lady / Tea For Two 1933 Art Tatum
# 2 1 The Genius Of Art Tatum, No. 21 1955 Art Tatum
# 3 1 The Tatum Group Masterpieces, Vol. 5 1964 Art Tatum / Lionel Hampton / Harry Edison / Buddy Rich / Red Callender / Barney Ke…
# 4 1 Live Sessions 1940 / 1941 1975 Art Tatum
# 5 1 20th Century Piano Genius 1986 Art Tatum
# 6 1 Jazz Masters (100 Ans De Jazz) 1998 Art Tatum
# 7 1 The Art Tatum - Ben Webster Quartet 2015 Art Tatum / Ben Webster
# 8 1 El Gran Tatum NA Art Tatum
# 9 1 Sweet Georgia Brown / Shiek Of Araby / Back O' Town Bl… 1945 Benny Goodman Quintet* / Esquire All Stars Featuring Louis Armstrong
#10 1 The Immortal Live Sessions 1944/1947 1975 Louis Armstrong
# … with 1,140 more rows