按照这种模式,我在单列中有数百行的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以实现此目标的任何建议?
答案 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=