2015-01-26 81 views
1

我開始與R一起工作,這必須是一個基本問題,但似乎並不明顯,如何輕鬆完成。如果我有以下數據集:R,具有多個y值的基本圖形

x y 

0,1 
0,2 
1,2 
1,4 

等等,所以每個x值有多個y值。這我怎麼能輕鬆地做一個顯示數據和手段和CI間隔的陰謀。

我可以做到這一點,因爲我一起提供了一堆解決方案,但是必須有一個更簡單的解決方案。

這就是我與這個非常簡單的數據文件

cardboard,r1,r2,r3,r4,r5,r6 

0,233,130,110,140,160 

101,293,340,313,260,366,38 

這混亂的代碼做:

er <- read.csv(file="ianevans.csv",head=TRUE,sep=",") 

er[,2:7] <- min(er[1,2:7],na.rm=TRUE)/er[,2:7]*100 

er$sharpness[1]=mean(as.vector(er[1,2:7], "numeric"),na.rm=TRUE) 
er$sharpness[2]=mean(as.vector(er[2,2:7], "numeric"),na.rm=TRUE) 

er$se[1]=sd(as.vector(er[1,2:7], "numeric"),na.rm=TRUE)/sqrt(6-1) 
er$se[2]=sd(as.vector(er[2,2:7], "numeric"),na.rm=TRUE)/sqrt(6-1) 

p <- ggplot(er,aes(x=cardboard,y=sharpness)) 
p1 <- p + geom_point(aes(y=sharpness,color="red",size=5)) 

p2 <- p1 + 
scale_shape_discrete(solid=F) + 
geom_point(aes(y=r1),color="blue",shape="o",size=3) + 
geom_point(aes(y=r2),color="blue",shape="o",size=3) + 
geom_point(aes(y=r3),color="blue",shape="o",size=3) + 
geom_point(aes(y=r4),color="blue",shape="o",size=3) + 
geom_point(aes(y=r5),color="blue",shape="o",size=3) + 
geom_point(aes(y=r6),color="blue",shape="o",size=3) 

p3 <- p2 + 
geom_errorbar(aes(ymax=sharpness+se,ymin=sharpness-se),width=5) 

同樣工作的,或多或少,但你可以看到有是一堆硬編碼數字,並且必須有一個更好的方式來建立數據文件並繪製圖表,並且可以輕鬆地處理每個x數據的不同數量的y數據。一些數據操作的方式也是很棘手的,因爲它應該可以做到這一點,而不需要單獨引用手段,sd's ,.

+0

的A [再現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)你的數據會有所幫助。但通常情況下,您可以創建一些功能來完成一些操作。 'se < - function(vec){sd(vec,na.rm = T)/ sqrt(len(vec))}'。如果你的數據是[整理表格](http://vita.had.co.nz/papers/tidy-data.pdf),它會促進這一點。 – jraab 2015-01-27 00:11:25

+0

這有幫助嗎?'ggplot(呃,aes(紙板,清晰度))+ stat_summary(fun.data = mean_cl_normal,geom =「pointrange」)''。或者你可能想''mean_sdl()' – user20650 2015-01-27 01:27:44

回答

0

這是我試圖簡化你的代碼。它是基於dplyrggplot2

library(dplyr) 
library(ggplot2) 

er <- structure(list(cardboard = c("100", "101"), r1 = c(30L, 293L), 
        r2 = c(233L, 340L), r3 = c(130L, 313L), r4 = c(110L, 260L 
        ), r5 = c(140L, 366L), r6 = c(160L, 38L)), .Names = c("cardboard", 
                      "r1", "r2", "r3", "r4", "r5", "r6"), row.names = c(NA, -2L), class = "data.frame") 

d2 <- er %>% 
    melt(id.vars='cardboard',na.rm=T) %>% # convert to tidy format 
    group_by(cardboard) %>%     # group by cardboard 
    mutate(v2=min(value)/value) %>%   # calculate v2 
    summarise(sharpness=mean(v2),se=sd(v2)) # calculate mean & sd 
# cardboard sharpness  se 
#1  100 0.3390063 0.3273334 
#2  101 0.2688070 0.3585103 

ggplot(d2) + 
    aes(x=cardboard,y=sharpness,ymax=sharpness+se,ymin=sharpness-se) + 
    geom_pointrange() 
+0

謝謝,我已經設法使這更明智,欣賞它,我已經進入了一個更復雜的情節。這是數據:https://drive.google.com/file/d/0B3dKJopPCAfCY0Y2MEhaaEdUZGs/view。我也可以用這個ggplot得到大部分圖(呃,aes(x = cardboard,y = sharpness))+ geom_point(aes(color = condition,shape = condition))。但我無法弄清楚如何將這些數據作爲誤差條:ddply(er,c(「cardboard」,「condition」),summarize,n = length(sharpness),mean = mean(sharpness), SD = SD(銳度),SE = SD/SQRT(n))的 – 2015-01-31 03:43:37