我有一个数据框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
...
以此类推。
感谢任何提示或建议,以帮助您更轻松地完成此操作!
答案 0 :(得分:3)
每列与第一列一起使用lapply
和cbind
。它将返回一个数据帧列表。
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])
使用purrr
和map
的其他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))