将每N行移至新列

时间:2019-01-22 04:42:24

标签: 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     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以实现此目标的任何建议?

2 个答案:

答案 0 :(得分:2)

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

$input1 = "1111n93";
echo $input1+0;

这个数据结构确实很脆弱;任何偏差都可以解决。更好的解决方案是在上游数据结构陷入混乱之前,对其进行维护。

答案 1 :(得分:2)

如果每个记录的列数相同,我首先将其包装到matrix中。使用@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...

或者甚至可以使用multi.line=TRUE的{​​{1}}参数将其一次性组合在一起:

scan

out <- data.frame(scan(text=df$col1[df$col1 != ""], multi.line=TRUE, what=rep(list(""), 4), sep="\n")) 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参数中指定输出格式。因此,如果第2列是整数,则可以执行以下操作:

what=