2017-09-19 6 views
1

私は自分のデータフレームを他の3つのデータフレームに分割しています。私はそれぞれを繰り返し、それに基づいてヒストグラムをプロットしています。私はこれらのプロットを別々のものに保存しています。しかし、ループの外側では、最初の2つではなく、最後の繰り返しからプロットだけを印刷することができます。私はループ内の3つのプロットをすべて印刷することができます。ここに私のコードは次のとおりです。ループ外の個所のプロットを印刷しようとしています。R

catCust1 <- myData[(myData$meanVal > 0 & myData$meanVal <= 20),] 
catCust2 <- myData[(myData$meanVal > 20 & myData$meanVal <= 40),] 
catCust3 <- myData[(myData$meanVal > 40 & myData$meanVal <= 60),] 

for(i in 1:3) { 
    if(i == 1) { 
    catCust <- catCust1 
    } else if(i == 2) { 
    catCust <- catCust2 
    } else if(i == 3) { 
    catCust <- catCust3 
    } 

    catCust <- na.omit(catCust) 
    numOrdersCatCust <- ddply(catCust, .(ORDERDATE), nrow) 
    numOrdersCatCust$numDay <- 1:nrow(numOrdersCatCust) 
    catCust$orderCount <- numOrdersCatCust[match(catCust$ORDERDATE, numOrdersCatCust$ORDERDATE), 2] 
    catCust$numDay <- numOrdersCatCust[match(catCust$ORDERDATE, numOrdersCatCust$ORDERDATE), 3] 
    setDT(catCust)[, uniqueCounter := .GRP, by = CUSTOMERID] 
    apply(catCust, 2, function(x)length(unique(x))) 
    threshold25catOne <- catCust[(catCust$uniqueCounter == as.integer(0.25 * max(uniqueCounter))), ] 
    threshold25catOneVal <- threshold25catOne$numDay 

    catCustPlot <- ggplot(data=catCust, aes(catCust$numDay)) + 
    geom_histogram(binwidth = 1, col="black", fill="white", alpha=0.1) + 
    labs(x="Day Number (Since 01-09-2016)", y="Orders") + 
    ggtitle("GRAPH TITLE") + 
    theme(plot.title = element_text(hjust = 0.5), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + 
    geom_vline(xintercept = threshold25catOneVal[1], color="purple") + 
    annotate("text", x = threshold25catOneVal[1]-7, y = max(catCust$orderCount) + 1000, angle = 0, label = threshold25catOneVal[1], vjust = 1.2, parse = TRUE) 
    # ABLE TO PRINT DIFFERENT PLOTS HERE 
    if(i == 1) { 
    catCustPlot1 <- catCustPlot 
    print(catCustPlot1) 
    } else if(i == 2) { 
    catCustPlot2 <- catCustPlot 
    print(catCustPlot2) 
    } else if(i == 3) { 
    catCustPlot3 <- catCustPlot 
    print(catCustPlot3) 
    } 
} 

# PRINTS ONLY catCustPlot3 
print(catCustPlot1) 
print(catCustPlot2) 
print(catCustPlot3) 

他の二つのプロットは私にエラーを与える:

Error: Aesthetics must be either length 1 or the same as the data

UPDATE:頭(MYDATA)

meanVal sumVal countCat 
75.98 75.98000 (60,80] 
36.37 80.55727 (80,100] 
50.96 52.67500 (40,60] 
15.33 15.33000 (0,20] 
17.48 27.65000 (20,40] 
51.35 101.64900 (100,1e+04] 
+0

あなたの '' 'if''は1つの条件だけを満たし、結果は1つで、1つのプロットになります! – amrrs

+0

すべての反復ですべての条件を満たしています。また、catCustPlotをいくつかの数字または文字に置き換えると、すべての値が正しくループの外側に出力されます。しかし、私はプロットを取得しようとすると失敗します。 – trollster

+0

@trollsterお願いします 'head(myData)' – PoGibas

答えて

0

私はちょうどあなたのループを簡素化し、ggplotオブジェクトを保存resPlots(印字なし)に設定します。ループが終了すると、そのループにアクセス/印刷することができます。

myData <- na.omit(myData) 
resPlots <- list() 
for(i in 1:3) { 
    if (i == 1) { 
     catCust <- myData[(myData$meanVal > 0 & myData$meanVal <= 20), ] 
    } else if (i == 2) { 
     catCust <- myData[(myData$meanVal > 20 & myData$meanVal <= 40), ] 
    } else if (i == 3) { 
     catCust <- myData[(myData$meanVal > 40 & myData$meanVal <= 60), ] 
    } 

    numOrdersCatCust <- ddply(catCust, .(ORDERDATE), nrow) 
    numOrdersCatCust$numDay <- 1:nrow(numOrdersCatCust) 
    catCust$orderCount <- numOrdersCatCust[match(catCust$ORDERDATE, numOrdersCatCust$ORDERDATE), 2] 
    catCust$numDay <- numOrdersCatCust[match(catCust$ORDERDATE, numOrdersCatCust$ORDERDATE), 3] 
    setDT(catCust)[, uniqueCounter := .GRP, by = CUSTOMERID] 
    apply(catCust, 2, function(x)length(unique(x))) 
    threshold25catOne <- catCust[(catCust$uniqueCounter == as.integer(0.25 * max(uniqueCounter))), ] 
    threshold25catOneVal <- threshold25catOne$numDay 

    resPlots[[i]] <- ggplot(catCust, aes(catCust$numDay)) + 
     geom_histogram(binwidth = 1, col = "black", fill = "white", alpha = 0.1) + 
     labs(x="Day Number (Since 01-09-2016)", y="Orders") + 
     ggtitle("GRAPH TITLE") + 
     theme(plot.title = element_text(hjust = 0.5), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + 
     geom_vline(xintercept = threshold25catOneVal[1], color="purple") + 
     annotate("text", x = threshold25catOneVal[1]-7, y = max(catCust$orderCount) + 1000, angle = 0, label = threshold25catOneVal[1], vjust = 1.2, parse = TRUE) 
} 

# First plot  
resPlots[[1]] 
+0

ちょっとPoGibas、私はこれを試しました。同じエラー。 – trollster

+0

'ggplot'の代わりに' resPlots [[i]] < - catCust'を実行して、テーブルが正しいかどうかチェックしてください。 – PoGibas

+0

同じ問題を試しました。 – trollster

関連する問題