R 将每N行转置到新列

R 将每N行转置到新列,r,dataframe,transpose,R,Dataframe,Transpose,我有一个df,在一列中有数百行,遵循以下模式: col1 1.12/17/18 2.10/10 3.Best Movie 4.This is the best movie ever... 5. 6. 7.1/1/2019 8.02/10 9.Worst Movie 10.This movie was awful... 我想知道是否有一种方法可以将4行范围内的每一行转换为它们自己的列,然后在新列下面堆叠下一个4行范围 因此,最终输出如下所示: Date Rating

我有一个df,在一列中有数百行,遵循以下模式:

   col1
1.12/17/18
2.10/10
3.Best Movie
4.This is the best movie ever...
5.
6.
7.1/1/2019
8.02/10
9.Worst Movie
10.This movie was awful...
我想知道是否有一种方法可以将4行范围内的每一行转换为它们自己的列,然后在新列下面堆叠下一个4行范围

因此,最终输出如下所示:

Date         Rating     Title       Review
12/17/18      10/10     Best Movie  This is the best movie ever...
1/1/2019      02/10     Worst Movie This movie was awful...

关于如何更改df以实现这一点,有什么建议吗

这基本上是一个从长到宽的转换,但您需要创建一个键列,它将成为列名和一个ID列,以便清楚哪些值进入哪些行。在tidyverse语法中

图书馆管理员 df% filtercol1!=%>%删除空行 mutatekey=代表“日期”、“评级”、“标题”、“审查”,n/4, id=cumsumkey=='日期'>% spreadkey,col1 >id日期评级审查标题 >这是有史以来最好的电影。。。最佳影片 >2 2 2019年1月1日02月10日这部电影糟透了。。。最差电影
但是,这种数据结构非常脆弱;任何偏差都可能使其全部消失。更好的解决方案是在数据结构陷入混乱之前,在其上游维护数据结构。

这基本上是一个从长到宽的转换,但您需要创建一个键列,它将成为列名和一个ID列,以便清楚哪些值进入了哪些行。在tidyverse语法中

图书馆管理员 df% filtercol1!=%>%删除空行 mutatekey=代表“日期”、“评级”、“标题”、“审查”,n/4, id=cumsumkey=='日期'>% spreadkey,col1 >id日期评级审查标题 >这是有史以来最好的电影。。。最佳影片 >2 2 2019年1月1日02月10日这部电影糟透了。。。最差电影 但是,这种数据结构非常脆弱;任何偏差都可能使其全部消失。更好的解决方案是在数据结构陷入混乱之前,保持其上游状态。

如果每条记录的列数相同,我会先将其包装到一个矩阵中。使用@alistaire的数据:

out <- as.data.frame(matrix(df$col1[df$col1!=""], ncol=4, byrow=TRUE))
names(out) <- c('Date', 'Rating', 'Title', 'Review')
out
#      Date Rating       Title                         Review
#1 12/17/18  10/10  Best Movie This is the best movie ever...
#2 1/1/2019  02/10 Worst Movie        This movie was awful...
scan的好处是,您还可以在what=参数中指定输出格式。因此,如果列2是一个整数,则可以执行以下操作:

scan(file, multi.line=TRUE, what=list("",1L,"",""), sep="\n")
如果每条记录的列数相同,我会先将其包装成一个矩阵。使用@alistaire的数据:

out <- as.data.frame(matrix(df$col1[df$col1!=""], ncol=4, byrow=TRUE))
names(out) <- c('Date', 'Rating', 'Title', 'Review')
out
#      Date Rating       Title                         Review
#1 12/17/18  10/10  Best Movie This is the best movie ever...
#2 1/1/2019  02/10 Worst Movie        This movie was awful...
scan的好处是,您还可以在what=参数中指定输出格式。因此,如果列2是一个整数,则可以执行以下操作:

scan(file, multi.line=TRUE, what=list("",1L,"",""), sep="\n")

我将添加到Aelista'的解决方案中,您可能需要在示例中过滤出空白行5-6。非常类似于这个老问题——我将添加到@ AistaIle的解决方案中,您可能希望通过在示例中过滤出空行5-6来开始。非常类似于这个老问题。