我有一个矢量列表,它们是不等长度的时间序列.我的最终目标是在图表中绘制时间序列ggplot2.我想我最好首先合并数据帧中的向量(其中较短的向量将使用NA扩展),这也是因为我想以表格格式(例如.csv)导出数据以供其他人阅读.
我有一个包含所有向量名称的列表.列标题可以由第一个向量设置,这是最长的.例如:
> mylist
[[1]]
[1] "vector1"
[[2]]
[1] "vector2"
[[3]]
[1] "vector3"
Run Code Online (Sandbox Code Playgroud)
等等
我知道要走的路是使用Hadley的plyr包但我想问题是我的列表包含向量的名称,而不是向量本身,所以如果我输入:
do.call(rbind, mylist)
Run Code Online (Sandbox Code Playgroud)
我得到一个包含我想要合并的dfs名称的单列df.
> do.call(rbind, actives)
[,1]
[1,] "vector1"
[2,] "vector2"
[3,] "vector3"
[4,] "vector4"
[5,] "vector5"
[6,] "vector6"
[7,] "vector7"
[8,] "vector8"
[9,] "vector9"
[10,] "vector10"
Run Code Online (Sandbox Code Playgroud)
等等
即使我自己创建了一个包含对象的列表,我也会获得一个空的数据帧:
mylist <- list(vector1, vector2)
mylist
[[1]]
1 2 3 4 5 6 7 8 9 10 11 12
0.1875000 0.2954545 0.3295455 0.2840909 0.3011364 0.3863636 0.3863636 0.3295455 0.2954545 0.3295455 0.3238636 0.2443182 …Run Code Online (Sandbox Code Playgroud) 我从网络上的多个来源生成了一个数据框,这些数据框事先经过清理,然后使用
cleans <- ls()
cleans <- cleans[grepl("Clean_News", cleans)]
Run Code Online (Sandbox Code Playgroud)
我第一次尝试将它们绑定在一起的灵感来自 Stack Overflow 上的一个解决方案:
All_News <- mapply(get, grep("Clean_News", ls(), value=T))
All_News <- data.frame(t(All_News))
All_News <- as.data.frame(All_News)
Run Code Online (Sandbox Code Playgroud)
然而,这对我来说是一个问题,因为结果是一个数据框,其中每列都是整数或字符的列表。所以,我的主要问题是如何将数据框中的每个列表转换为 df 中的普通列。我在 Stack Overflow 上尝试了很多手工制作的函数,但没有一个对我有用(我猜是因为我缺乏经验......)。df 的形式为
All_News <- data.frame(a=I(list(1,1:2,1:3)), b=I(list(4:6,7:9,10:11)))
Run Code Online (Sandbox Code Playgroud)
或者,我尝试了以下方法,该方法有效:
All_News <- do.call(rbind, lapply(cleans, get))
Run Code Online (Sandbox Code Playgroud)
但有一个巨大的缺点,那就是我没有成功地将数据框的名称作为行名/或第一列放入数据框中......所以,我的第二个问题是如何将单个数据框的名称附加到每个数据框巨大 df 的行,而不是像下面的代码行那样的 id。
t2 <- rbindlist(lapply(cleans, get), idcol = "id")
Run Code Online (Sandbox Code Playgroud)
这并没有多大好处,因为我需要重复使用所有数据帧的名称 x 次作为标识符,例如,并且由于这是一个包含数千个网页的自动化过程,所以我事先不知道每个数据帧中的行数。数据如下:
news1 data1 data2
news1 data5 data6
news2 data3 data4
and so on.
Run Code Online (Sandbox Code Playgroud)
我尝试了一些类似的事情
nr <- length(cleans)
names <- rep(cleans, nr)
names <- sort(names)
Run Code Online (Sandbox Code Playgroud)
但没有取得多大成功。
这里我有一个不同长度向量的列表.我想要一个data.frame.我在SO中看过很多关于它的帖子(参见参考资料),但是没有一个像我预期的那样简单,因为这实际上是数据预处理中的常见任务.谢谢.
这里最简单的意思as.data.frame(aa)是它是否有效.所以R的基础包中的一个函数会很棒.sapply(aa, "length<-", max(lengths(aa)))实际上有四个功能.
一个例子如下所示.
输入:
aa <- list(A=c(1, 3, 4), B=c(3,5,7,7,8))
Run Code Online (Sandbox Code Playgroud)
输出:
A B
1 3
3 5
4 7
NA 7
NA 8
Run Code Online (Sandbox Code Playgroud)
A和B是data.frame的colnames.
答案是sapply(aa, '[', seq(max(sapply(aa, length)))),但它也很复杂.
参考: