2017-11-26 2 views
0

안녕하세요. 저는 현재 동일한 엑셀 워크 북으로 70 장이 있으며 데이터를 기반으로 일일 수익을 찾아서 모든 70 장을 하나의 데이터 프레임으로 병합하려고합니다. 70 장에는 모두 날짜 및 공개 가격이 포함되어 있습니다. 여기 내 코드는 지금까지동일한 통합 문서의 여러 워크 시트에 대해 R로 매일 반환되는 항목을 찾아서 병합 하시겠습니까?

require(XLConnect) 
wb <- loadWorkbook(system.file("crypto.xlsx", package = "XLConnect")) 
crypto = readWorksheet(wb, sheet = getSheets(wb),startRow=1,endRow = 20, endCol=2) 

내가 각 시트의 수익을 찾은 다음 모두 70 일에 데이터 프레임을 병합 할 소프트웨어 R입니다. 그러나 시간은이 모든 시트에서 다르며 병합 할 수있는 방법을 찾을 수 없습니다. 최종 데이터 프레임에서 변수를 원합니다 Date, Price1, Dailyreturn1, Price2, DailyReturn2 ......... Price70, DailyReturn70 반환 및 병합으로 도움이 될 것입니다.

여기 내 데이터가 훨씬 더 많은 행을 가진 것처럼 보이며 데이터 형식이 모든 70 개의 시트에서 동일합니다.

Date  Open  High Low Close Market Cap 
28-Apr-13 135.3  135.98 132.1 134.21 1,500,520,000 
29-Apr-13 134.44  147.49 134 144.54 1,491,160,000 
30-Apr-13 144   146.93 134.05 139  1,597,780,000 
1-May-13 139   139.89 107.72 116.99 1,542,820,000 

최종 결과가 70 장 모두 하나로 결합 된 것처럼 보이기를 바랍니다. DR은 체인 Reduce 모든 X 행 (즉, 가입 왼쪽) 유지 병합 고려 일일 창

Date Open1 DR1 Open2 DR2 Open3 DR3............Open70 DR70 
+0

은 무엇입니까 * 가격 * 또는 * DailyReturn *와

? 한 장에 출력물을 시험해보십시오. – Parfait

+0

일일 수익은 공개 가격을 기준으로 한 단순한 수익률입니다. –

+0

원하는 결과가 두 개 있습니다. 그리고 다시 '암호'를 시도 했습니까? – Parfait

답변

0

위한 것이다. 하지만 lapply에서 setNames으로 수행 할 수있는 열의 이름을 바꾸려면 먼저 목록을 업데이트하십시오.

# ASSUME ALL DFs ARE ONLY Date and Open 
crypto2 <- lapply(seq_along(crypto), function(i) 
    setNames(crypto[[i]], c("Date", paste0("DR", i)))) 

finaldf <- Reduce(function(x, y) merge(x, y, by="Date", all.x=TRUE), crypto2) 

참고 : 각 조합이 반환됩니다 가입 이후 merge 빠르게 커질 것입니다 귀하의 데이터가 다른 열기 값이 중복 된 날짜가있는 경우이 Reduce 접근 방식에 매우주의해야합니다. 임의의 데이터 (경고 이상 당 고유의 날짜를 반환하는 데 사용 집계)

set.seed(123) 

crypto <- lapply(seq(10), function(i) 
    aggregate(Open~Date, data.frame(
    Date = Sys.Date()- sapply(seq(30), function(i) sample(15,1,replace=TRUE)), 
    Open = abs(rnorm(30)*100) 
), FUN=max)) 

crypto2 <- lapply(seq_along(crypto), function(i) 
    setNames(crypto[[i]], c("Date", paste0("DR", i)))) 

finaldf <- Reduce(function(x, y) merge(x, y, by="Date", all.x=TRUE), crypto2) 

출력

finaldf 
#   Date  DR1  DR2  DR3  DR4  DR5  DR6  DR7  DR8  DR9  DR10 
# 1 2017-11-12 70.92008 56.29895 37.56029 136.403745 100.56363  NA 138.80490 28.73408 64.75134 195.07210 
# 2 2017-11-13 102.55714 212.84519 190.23618 199.274849 127.22668  NA 151.60676  NA 188.63252 90.35164 
# 3 2017-11-15 44.82098 105.27115 135.98407 101.755864 123.56935 123.66758 107.49451  NA 91.35660 45.73573 
# 4 2017-11-16 22.04866 36.89645 63.07541 151.921771 43.88187 103.96804 168.75895 144.14618 90.44355  NA 
# 5 2017-11-17 122.07177 37.45809 229.30790 175.323736 88.33028 35.88557 84.90611 72.82191 23.11149 70.10036 
# 6 2017-11-18 109.68390  NA 159.85088 62.418747 163.35684 116.52534 154.66092 90.42150 33.33700 79.76007 
# 7 2017-11-19 205.00847  NA 78.86220 246.589819  NA 60.85572  NA 245.80605 85.52022 184.32663 
# 8 2017-11-20 114.88076 37.24388 154.75811 72.160444 71.27033 60.53707 107.4.88494 131.82207 76.46060 
# 9 2017-11-21 33.32074 126.01552 50.21987 257.145815 222.49877 50.63335 208.67174 106.10953 115.29362 148.37795 
# 10 2017-11-22 230.91689 21.53805 11.36399 97.400958 239.74525 96.72673  NA 58.99827 216.14158 122.09637 
# 11 2017-11-24 33.17820 104.91770 66.47694   NA 45.03386 142.05655 260.16997 154.04424  NA 103.81310 
# 12 2017-11-25 37.96395 97.69734 52.11173 57.185006 163.63793 18.43089 141.52819 154.77765 65.80102 109.95509 
# 13 2017-11-26 37.06600 76.90422 175.65274 3.303616 177.95029 194.58512 87.52555 118.71868 39.43948 111.64164 
+0

네가 제공 한 예와 같이 하나의 데이터 프레임에 모든 통화의 모든 공개 가격이 있습니다. 나는 갈 길을 하나 더 가지고 있는데 문제가 생겼다. DR1에서 DR70까지 모든 수식에 일일 반품을 적용하고 싶습니다. 예를 들어, 예제 데이터를 기반으로 적용하려는 공식은 (102.55714-70.92008) /70.92008과 같지만 DR1에서 DR70까지의 모든 데이터를 포함합니다. 어떤 도움 이이 –

+0

에 감사하겠습니다 기술적으로 그것이 제목과 게시물을 넘어 확장으로 새로운 질문이어야합니다. 그리고 R의'diff'를보십시오. 이 질문을 StackOverflow 방식으로 [감사] (https://meta.stackexchange.com/a/5235)라고 말하면 안됩니다. – Parfait

+0

괜찮습니다. 감사합니다. –

관련 문제