簡體   English   中英

使用變量在R中添加數據框列

[英]Using a variable to add a data frame column in R

我正在努力實現以下目標

stocks <- c('AXP', 'VZ', 'V')
library('quantmod')
getSymbols(stocks)

上面的命令創建3個名為AXP,VZ和V的數據變量

prices <- data.frame(stringAsFactors=FALSE)

在這里,我試圖創建一個名稱為票據的列(例如AXP),其中的數據如下所示。應在框架中添加3列,名稱為AXP,VZ和V,其數據分別為AXP $ AXP.Adjusted,VZ $ VZ.Adjusted ,V $ V。

for (ticker in stocks)
{
  prices$ticker <- ticker$ticker.Adjusted
}

我該如何實現? 當我嘗試這個R給出這樣的錯誤

Error in ticker$ticker.Adjusted : 
  $ operator is invalid for atomic vectors

有任何想法嗎?

提前致謝

這是一種更簡單的方法

do.call('cbind', lapply(mget(stocks), function(d) d[,6]))

說明:

  1. mget(stocks)將三個數據幀作為列表獲取
  2. lapply提取包含感興趣變量的第六列。
  3. do.call將列表從(2)傳遞給cbind ,后者將它們作為列綁定在一起。

注意:此解決方案無法處理數據框中的不同列數。

我以前不了解您的問題,現在我想我了解您想要什么:

您寫的內容不起作用,因為對象ticker是字符串。 如果要獲取以該字符串命名的對象,則必須評估已解析的文本。

嘗試這個:

for (ticker in stocks){
      prices <- cbind(prices, eval(parse(text=ticker))[,paste0(ticker, ".", "Adjusted")])

}

這將為您提供:

An ‘xts’ object on 2007-01-03/2014-01-28 containing:
  Data: num [1:1780, 1:4] 53.4 53 52.3 52.8 52.5 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "AXP.Adjusted" "AXP.Adjusted.1" "VZ.Adjusted" "V.Adjusted"
  Indexed by objects of class: [Date] TZ: UTC
  xts Attributes:  
List of 2
 $ src    : chr "yahoo"
 $ updated: POSIXct[1:1], format: "2014-01-29 01:06:51"

您將要遇到的一個問題是,三個下載的行數不同,因此將它們全部綁定到一個數據幀中將失敗。

下面的代碼使用每個文件的最后1000行(最近),而不使用循環。

stocks <- c('AXP', 'VZ', 'V')
library('quantmod')
getSymbols(stocks)

prices=do.call(data.frame,
               lapply(stocks,
                      function(s)tail(get(s)[,paste0(s,".Adjusted")],1000)))
colnames(prices)=stocks
head(prices)
#              AXP    VZ     V
# 2010-02-08 34.70 21.72 80.58
# 2010-02-09 35.40 22.01 80.79
# 2010-02-10 35.60 22.10 81.27
# 2010-02-11 36.11 22.23 82.73
# 2010-02-12 36.23 22.15 82.38
# 2010-02-16 37.37 22.34 83.45

從內到外, s是代碼(例如, "AXP" ); get(s)返回具有該名稱的對象,因此AXP get(s)[,paste0(s,".Adjusted")]等效於AXP[,"AXP.Adjusted"] ; tail(...,1000)返回最后1000行的... 因此,當s =“ AXP”時,該函數返回AXP$AXP.Adjusted的最后1000行。

lapply(...)將函數應用於股票中的每個元素。

do.call(data.frame,...)調用由lapply(...)返回的列列表的data.frame函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM