2014-02-13 2 views
1
START <- '2013-09-03'  
symbolList <- list("AAPL", "MSFT", "TSLA", "GOOG", "IBM") 
for (ii in 1:length(symbolList)) 
    { 
    getSymbols(paste(symbolList[ii]), src='yahoo', from=START) 
    } 

이렇게하면 6 x 5 개의 개체가 생성됩니다. 나는 mergedData를 만들려하지만,로는 내가 아래에 그 일을하고있는 무력 방법을 symbolList를 참조, 그리고.목록에있는 기호에서 특정 정보를 불러오는 데 문제가 있습니다.

mergedData <- merge(AAPL[,6], MSFT[,6], TSLA[,6], GOOG[,6], IBM[,6]) 
colnames(mergedData) <- c("Apple", "Microsoft", "Tesla", "Google", "IBM") 
내가 symbolList을 통해 루프 방법을 사용하여 위의 마지막 두 줄을 다시 할 방법

? 또한 따옴표가있는 원래 목록은 내 문제의 일부일 수 있습니다. 생성 된 xts는 AAPL, MSFT 등입니다. 따옴표를 사용하십시오. 어떻게해야합니까?

감사합니다.

답변

1

(A)의 결과의리스트를 생성한다 (목록에 함수를 적용) (심볼 심볼 이름 변환) get, do.calllapply을 (사용 이들 마지막 두 라인을 쓸 수있다 [다른] 기능) :

mergedData <- do.call(merge, lapply(symbolList, function(sym) { get(sym)[,6] })) 
colnames(mergedData) <- c("Apple", "Microsoft", "Tesla", "Google", "IBM") 

그러나 당신은 또한 상당히 getSymbolsauto.assign=FALSE를 사용하여 전체 프로세스를 단순화 할 수있다. (. 나는 또한 정말 당신이 필요로하는 모든 것입니다 명명 된 벡터로 목록에서 symbolList을 변경했습니다) :

mergedData <- do.call(merge, lapply(symbolList, function(sym) { 
    setNames(getSymbols(sym, src='yahoo', from=START, auto.assign=FALSE)[,6], names(sym)) 
})) 

:

library(quantmod) 
START <- '2013-09-03'  
symbolList <- c(Apple="AAPL", Microsoft="MSFT", Tesla="TSLA", Google="GOOG", IBM="IBM") 
dataList <- lapply(symbolList, function(sym) { 
    setNames(getSymbols(sym, src='yahoo', from=START, auto.assign=FALSE)[,6], names(sym)) 
}) 
mergedData <- do.call(merge, dataList) 

을 또는 당신은 정말 고밀도 코드를 를 원하는 경우

부록 - 전화 문의 (귀하의 의견에 대한 답변)

본문 내용 :

dataList <- lapply(symbolList, function(sym) { 
    setNames(getSymbols(sym, src='yahoo', from=START, auto.assign=FALSE)[,6], names(sym)) 
}) 

lapply에 두 개의 인수를 전달했습니다. 벡터는 symbolList (목록 일 수 있음)과 function(sym) { ... }입니다.

lapply(symbolList, nchar) 

그것은 호출과 동일했을 것이다 : 나는 각 기호의 문자 수를 계산하기를 원한다면, 내가 nchar에 통과 한 수 - 예를 들어, 내가 미리 정의 함수를 통과 할 수 모두가 양식

list(Apple=4, Microsoft=4, Tesla=4, Google=4, IBM=3) 

하지만 그 대신 nchar를 사용하는의 목록을 반환

list(Apple=nchar(symbolList[[1]]), Microsoft=nchar(symbolList[[2]]), Tesla=nchar(symbolList[[3]]), Google=nchar(symbolList[[4]]), IBM=nchar(symbolList[[5]])) 

, 나는 내 자신의 기능을 썼다. 이 함수는 nchar 예제에서 4, 4, 4, 4 및 3 대신에 원하는 것을 반환합니다.이 기능은 별도로 정의 할 수 있습니다 :

myfun <- function(sym) { 
    setNames(getSymbols(sym, src='yahoo', from=START, auto.assign=FALSE)[,6], names(sym)) 
} 

그리고 우리는 우리가 원하는 결과를 얻을 수 lapply-myfun을 통과 할 수 :

dataList <- lapply(symbolList, myfun) 
이 경우

보다는 4, 4, 4, 4 , 3, xts 객체 목록을 얻습니다. 우리는 또한 같은 목록이 방법을 구축 할 수 :

dataList2 <- list(Apple=myfun(symbolList[[1]]), Microsoft=myfun(symbolList[[2]]), Tesla=myfun(symbolList[[3]]), Google=myfun(symbolList[[4]]), IBM=myfun(symbolList[[5]])) 

하지만 물론 lapply 버전 목록 요소의 수와 이름에 대한 깨끗하고 유연

.

실제로 변수 (이 경우 myfun)에 함수를 할당 한 다음이 함수를 lapply에 전달하는 것은 약간 힘든 일입니다. 그래서 원래의 대답에서 나는 그 이름을주지 않고 lapply 호출 내에서 함수를 정의하기로 결정했습니다. myfunfunction(sym) { ... }은 동일한 함수 객체입니다. 정보 감안할 때, 난 당신이 지금 내 원래의 대답에서 lapply 전화를 이해 (또는 수정) 할 수 있기를 바랍니다, 여기에 복사 :

# easier if this is a character vector instead of a list 
symbolList <- c("AAPL", "MSFT", "TSLA", "GOOG", "IBM") 
# corresponding vector of company names 
symbolNames <- c("Apple", "Microsoft", "Tesla", "Google", "IBM") 
e <- new.env()        # new environment 
getSymbols(symbolList, from=START, env=e) # store symbols in 'e' 
# eapply() loops over all objects in 'e' and applies the Ad() function 
# objects in 'e' won't be in a known order, so we order by symbolList 
# then we merge and set the column names to the company names 
mergedData <- setNames(do.call(merge, eapply(e, Ad)[symbolList]), symbolNames) 
+0

환상적인 : 여기

dataList <- lapply(symbolList, function(sym) { setNames(getSymbols(sym, src='yahoo', from=START, auto.assign=FALSE)[,6], names(sym)) }) 
DolemiteMofo

+1

도와 줘서 기쁩니다! 함수 (sym) 비트를 설명하려고이 부록에 부록을 추가했습니다. – pangia

+1

많은 감사합니다! 설명에 감사드립니다 – DolemiteMofo

2

는 환경 getSymbols를 사용하는 솔루션입니다 그리고 매우 우아한! 3 블록 중 2 블록이 내가 FWIW와 함께 간 것입니다. "function (sym)"을 사용하여 dataList <- ... 부분의 장면 뒤에서 일어나는 일에 대해 더 자세히 설명 할 수있는 기회가 있습니다. R의 함수를 사용하는 것이 매우 좋지 않으며 약간의 수업을 좋아합니다. 실제로 무슨 일이 벌어지고 있는지. 고맙습니다.
+0

고마워요 조쉬! 입력을 감사하십시오. – DolemiteMofo

관련 문제