相关疑难解决方法(0)

将不等长的矢量组合成数据帧

我有一个矢量列表,它们是不等长度的时间序列.我的最终目标是在图表中绘制时间序列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)

r

11
推荐指数
1
解决办法
3万
查看次数

将数据框中的每个列表转换为普通列

我从网络上的多个来源生成了一个数据框,这些数据框事先经过清理,然后使用

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)

但没有取得多大成功。

r data-conversion dataframe

3
推荐指数
1
解决办法
3815
查看次数

将具有各种长度向量的列表转换为R中的data.frame的最简单方法

这里我有一个不同长度向量的列表.我想要一个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)))),但它也很复杂.

参考:

  1. 如何将包含不同长度矢量的列表转换为R中的可用数据帧?

  2. 组合不同长度的(cbind)向量

r list dataframe data-science

2
推荐指数
1
解决办法
893
查看次数

标签 统计

r ×3

dataframe ×2

data-conversion ×1

data-science ×1

list ×1