2017-08-01 72 views
0

我一直在試圖創建一個for循環,將通過我的數據框,併爲我有每個個人ID作出相同的情節。下面是一些樣本數據: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") 

我想創建一個for循環,只是通過每個個體週期,使用戶在同樣的情節。這是我到目前爲止:

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

你必須'打印(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