将重复的列折叠成行

Collapse repeated columns into rows

我有一个从 API 中提取的数据框。经过一番清理后,它看起来像这样:

Title   Year  Rating  Title    Year  Rating  Title    Year  Rating
Movie 1 1997  6.7     Movie 2  1987  8.2     Movie 3  2009  7.1

列 headers 重复,在本例中,一行包含 3 个单独的条目。

我将如何重塑它以得到 3 列(标题、年份、评分)和 3 行(电影 1、电影 2、电影 3)?

最简单的方法是什么?

将输入 data.frame 转换为列表,并根据常用的列名将列拆分成组。然后取消列出每组列以在每组中生成一个列并转换回 data.frame。 (如果 DF 中有多于一行,这也适用。)

as.data.frame(lapply(split(as.list(DF), names(DF)), unlist))

给予:

  Rating  Title Year
1    6.7 Movie1 1997
2    8.2 Movie2 1987
3    7.1 Movie3 2009

注意: 我们假设此输入:

Lines <- "Title   Year  Rating  Title    Year  Rating  Title    Year  Rating
Movie1 1997  6.7     Movie2  1987  8.2     Movie3  2009  7.1"
DF <- read.table(text = Lines, header = TRUE, check.names = FALSE, as.is = TRUE)

我想如果你从 API 那里得到数据,你的清洁一定是哪里出了问题。除了列顺序之外,您已经丢失了所有信息来确定哪个评级和哪个标题与哪部电影对应。

但无论如何,你可以这样做:

library(dplyr)
library(tidyr)

data %>%
  gather(variable, value) %>%
  mutate(ID = rep(1:3, length.out = n() ) ) %>%
  spread(variable, value)

这可以通过 data.table 中的 melt 来完成,它可以通过指定 pattern

measure 中获取多个列
library(data.table)#v1.9.6+
melt(setDT(df1), measure=patterns('Title', 'Year', 'Rating'), 
    value.name=c('Title', 'Year', 'Rating'))[,variable:=NULL][]
#     Title Year Rating
#1: Movie 1 1997    6.7
#2: Movie 2 1987    8.2
#3: Movie 3 2009    7.1

数据

df1 <- structure(list(Title = "Movie 1", Year = 1997L, Rating = 6.7, 
Title = "Movie 2", Year = 1987L, Rating = 8.2, Title = "Movie 3", 
Year = 2009L, Rating = 7.1), .Names = c("Title", "Year", 
"Rating", "Title", "Year", "Rating", "Title", "Year", "Rating"
), class = "data.frame", row.names = c(NA, -1L))