将重复的列折叠成行
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))
我有一个从 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))