2017-08-01 12 views
0

私はデータフレームを通り、私が持っている個々のIDごとに同じプロットを作成するforループを作成しようとしていました。ここではいくつかのサンプルデータです:forループで単一のデータフレームから複数のggplotsを作成する

TJID1 <- c("TJ22", "TJ22", "TJ23", "TJ23", "TJ23", "TJ24", "TJ24") 
Day <- c("2005-11-22", "2005-11-23", "2006-12-01", "2006-12-02", "2006-12-03","2005-07-08", "2005-07-08") 
Mean.Depth <- c (2, 2, 3, 4, 5, 6, 6) 
SE.Depth <- c(1, 1, 2, 2, 1, 2, 2) 
sample <- cbind(TJID1, Day, Mean.Depth, SE.Depth) 
sample <- as.data.frame(sample) 

私は別のTJ番号として各個人が持っているし、各TJのために、彼らは異なる日々の深手段を持っています。各個人の日が変わります。私は、個々のTJ TJ22 <- sample [sample$TJID1 == "TJ22", ]によってメインデータフレームをサブセット化することができました。私は、個々ているだけのサイクルループのために作成したい

DailyMeans_TJ22 <- ggplot(TJ22, aes(x=Day, y=Mean.Depth))+ 
    geom_point()+ 
    geom_line()+ 
    geom_errorbar(aes(ymin=Mean.Depth-1.96*SE.Depth, ymax=Mean.Depth+1.96*SE.Depth), width = 0.5, col="red") 

と同じプロットを作る:プロットから私のコードは、(サブセット化データフレームを使用して)、その後です。これは私がこれまで持っているものです:

var_list = combn(names(sample) [3:4], 3, simplify=FALSE) 
plot_list = list() 
for (i in unique (sample$TJID1)){ 
    TJ <- sample[sample$TJID1== i,] 

    p = ggplot(TJ, aes_string(x=var_list[[i]][1], y=var_list[[i]][2])) + 
    geom_point()+ 
    geom_line() 

plot_list[[i]] = p 
} 

しかし、それは文字通り私に何も与えません。どんな助けもありがとう!

+0

あなたは 'print(p)'する必要があります。ループの代わりに 'facet_wrap(〜TJID1)'を使うのはなぜですか? –

答えて

1

ここにアイデアがあります。サブセットsampleに関数を設計し、プロットを作成して返します。その後、lapplyを使用して、TJID1の一意の値をループしました。

元のsampleデータフレームでは、これらの数値列は因子として表されます。私はそれを修正するためにsampleデータフレームを作成する方法を変更しました。最後の一言sampleは、Rにsampleと呼ばれる機能があり、混乱の原因となるため、悪い名前です。将来他の関数名と一致しない他の名前を使用してデータフレームの名前を付けてください。

# Load package 
library(ggplot2) 

# Create example data frame 
sample <- data.frame(TJID1 = c("TJ22", "TJ22", "TJ23", "TJ23", "TJ23", "TJ24", "TJ24"), 
        Day = c("2005-11-22", "2005-11-23", "2006-12-01", "2006-12-02", "2006-12-03","2005-07-08", "2005-07-08"), 
        Mean.Depth = c (2, 2, 3, 4, 5, 6, 6), 
        SE.Depth = c(1, 1, 2, 2, 1, 2, 2), 
        stringsAsFactors = FALSE) 

# Design a function 
gg_fun <- function(parameter, dt){ 

    p <- ggplot(dt[dt$TJID1 == parameter, ], aes(x=Day, y=Mean.Depth))+ 
    geom_point()+ 
    geom_line()+ 
    geom_errorbar(aes(ymin=Mean.Depth-1.96*SE.Depth, ymax=Mean.Depth+1.96*SE.Depth), width = 0.5, col="red") + 
    ggtitle(parameter) 

    return(p) 
} 

# Apply the function 
plot_list <- lapply(unique(sample$TJID1), gg_fun, dt = sample) 
+0

うわー!ありがとうございました:)私はループを使用しようとすることに集中していましたが、私は機能についても考えていませんでした。これは素晴らしい仕事でした! –

+0

また、+ ggtitle()関数に追加したいのであれば、個々のプロットのTJ番号をタイトルとして表示するにはどうしたらいいですか? –

+0

私の更新を見てください。これはうまくいくはずです。 – www

関連する問題