如何将具有不同数据框名称的列提取到列表中?

时间:2019-05-28 12:07:12

标签: r

我有一个数据框df,其中有一个日期列,而另50个列分别具有以各自股票命名的股票价格。 数据框的前几列基本上是这样的:

df
Date        Adidas  Allianz  Shell  IBM  ...
2015-12-01  130     45       200    39
2015-12-02  131     46       199    40
...

我想执行几个动作(例如计算每日收益等),因此我总是想要一个新列作为输出。

由于我想保留一下概览,所以我的想法是将每个库存列与日期列一起提取,然后将它们放在一个新的数据框中,以基本上创建50个新数据框,每个库存一个。然后,我将创建这50个数据帧的列表,然后使用列表上的lapply功能执行以下所有操作。 我不想在R中分别输入每个列的名称,所以有什么功能可以让我提取另一列然后再将其与Date列一起放入新的数据框中?

我的新数据应该看起来像这样:

list

dfAdidas
Date        Adidas
2015-12-01  130
2015-12-02  131
...

dfAllianz
Date        Allianz
2015-12-01  45
2015-12-02  46
...

以此类推。

感谢任何提示或建议,以帮助您更轻松地完成此操作!

2 个答案:

答案 0 :(得分:3)

每列与第一列一起使用lapplycbind。它将返回一个数据帧列表。

lapply(df[-1], function(x) cbind(df[1], x))

#$Adidas
#        Date   x
#1 2015-12-01 130
#2 2015-12-02 131

#$Allianz
#        Date  x
#1 2015-12-01 45
#2 2015-12-02 46

#$Shell
#        Date   x
#1 2015-12-01 200
#2 2015-12-02 199

#$IBM
#        Date  x
#1 2015-12-01 39
#2 2015-12-02 40

或使用Map

Map(cbind.data.frame, x = df[1], y = df[-1])

使用purrrmap的其他map2版本将是

purrr::map(df[-1], ~cbind(df[1], y = .))
purrr::map2(df[-1], df[1], cbind.data.frame)

答案 1 :(得分:0)

base R的一个选项是遍历索引并将该索引用于子集列

lapply(2:ncol(df), function(i) df[c(1, i)])
#[[1]]
#        Date Adidas
#1 2015-12-01    130
#2 2015-12-02    131

#[[2]]
#        Date Allianz
#1 2015-12-01      45
#2 2015-12-02      46

#[[3]]
#        Date Shell
#1 2015-12-01   200
#2 2015-12-02   199

#[[4]]
#        Date IBM
#1 2015-12-01  39
#2 2015-12-02  40

数据

df <- structure(list(Date = c("2015-12-01", "2015-12-02"), Adidas = 130:131, 
Allianz = 45:46, Shell = 200:199, IBM = 39:40),
 class = "data.frame", row.names = c(NA, -2L))