## PTT大神相助 1 #########################
##########################################
# andrew43 建議approx()解決
##########################################
library( ggplot2)
loci <- read.table ( "loci list" , header= TRUE)
ci <- read.table ( "ci_add0" , header= TRUE)
dt <- data.frame ( id = loci$Locus, x = loci$Het, y = loci$Fst)
line.upper <- data.frame ( x = ci$Het, y = ci$X0.5.1.pval .quantile )
line.lower <- data.frame ( x = ci$Het, y = ci$Fst)
dt$upper <- approx( line.upper $x, line.upper $y, dt$x) $y
dt$lower <- approx( line.lower $x, line.lower $y, dt$x) $y
dt$code <- dt$y > dt$lower & dt$y < dt$upper
print( dt)
ggplot( dt, aes( x, y) ) +
geom_point( aes( color = code) ) +
geom_line( data = line.upper , color = "red" , aes( x = x, y = y) ) +
geom_line( data = line.lower , color = "green" , aes( x = x, y = y) )
#原作者andrew43提醒
# 紅點表示在界外(dt$code值為FALSE),
# 綠點表示在界內(dt$code值為TRUE),
# 灰點表示不能判斷(上界或下界不存在;dt$code值為NA)
# 抓取neutral loci,以yes為抓取基準
neutral <- subset( dt, code== "TRUE" )
outlier <- subset( dt, code== "FALSE" )
# 計算數量(多種方式)
dim( outlier) [ 1 ]
nrow( outlier)
length( outlier[ , 1 ] )
# 輸出
write.table ( outlier$id, file= "/Users/path/list.txt" , quote = FALSE, row.names = FALSE, col.names = FALSE)
## PTT大神相助 2 #########################
##########################################
# showfeb 建議 sp::point.in.polygon
##########################################
require( ggplot2)
require( sp)
loci <- read.table ( "loci list edit" , header= TRUE)
ci <- read.table ( "ci_add0" , header= TRUE)
df= data.frame ( id= loci$Locus, x= loci$Het, y= loci$Fst)
Line1= data.frame ( x= ci$Het, y= ci$Fst, g= "Lower" )
Line2= data.frame ( x= rev( ci$Het) , y= rev( ci$X0.5.1.pval .quantile ) , g= "Upper" )
Linedf= rbind( Line1, Line2)
df$in.pg = ifelse( as.logical ( point.in .polygon ( df$x, df$y, pol.x = Linedf$x, pol.y = Linedf$y) )
, "Yes" , "No" )
head( df)
ggplot( ) +
geom_point( aes( x= x, y= y, colour= in.pg ) , data= df, inherit.aes = F) +
geom_path( aes( x= x, y= y, group= g, colour= g) , size= 1.2 , data= Linedf, inherit.aes = F)
# 注意多邊形繪製的順序,尤其Line2當中的x與y有"rev",倒序後才可以繪製成完整的多邊形
# 可使用下列方式輸出多邊形確認是否正確
# plot.new()
# polygon(Linedf$x, Linedf$y)
# 抓取neutral loci,以yes為抓取基準
neutral <- subset( df, in.pg == "Yes" )
outlier <- subset( df, in.pg == "No" )
# 計算數量(多種方式)
dim( outlier) [ 1 ]
nrow( outlier)
length( outlier[ , 1 ] )
# 輸出
write.table ( outlier$id, file= "/Users/path/list.txt" , quote = FALSE, row.names = FALSE, col.names = FALSE)
IyMg77yw77y077y05aSn56We55u45YqpIDEgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBhbmRyZXc0MyDlu7rorbBhcHByb3goKeino+axugojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgpsaWJyYXJ5KGdncGxvdDIpCgpsb2NpIDwtIHJlYWQudGFibGUoImxvY2kgbGlzdCIsIGhlYWRlcj1UUlVFKQpjaSA8LSByZWFkLnRhYmxlKCJjaV9hZGQwIiwgaGVhZGVyPVRSVUUpCgoKZHQgPC0gZGF0YS5mcmFtZShpZCA9IGxvY2kkTG9jdXMsIHggPSBsb2NpJEhldCwgeSA9IGxvY2kkRnN0KQpsaW5lLnVwcGVyIDwtIGRhdGEuZnJhbWUoeCA9IGNpJEhldCwgeSA9IGNpJFgwLjUuMS5wdmFsLnF1YW50aWxlKQpsaW5lLmxvd2VyIDwtIGRhdGEuZnJhbWUoeCA9IGNpJEhldCwgeSA9IGNpJEZzdCkKCmR0JHVwcGVyIDwtIGFwcHJveChsaW5lLnVwcGVyJHgsIGxpbmUudXBwZXIkeSwgZHQkeCkkeQpkdCRsb3dlciA8LSBhcHByb3gobGluZS5sb3dlciR4LCBsaW5lLmxvd2VyJHksIGR0JHgpJHkKZHQkY29kZSA8LSBkdCR5ID4gZHQkbG93ZXIgJiBkdCR5IDwgZHQkdXBwZXIKCnByaW50KGR0KQoKZ2dwbG90KGR0LCBhZXMoeCwgeSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvZGUpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBsaW5lLnVwcGVyLCBjb2xvciA9ICJyZWQiLCBhZXMoeCA9IHgsIHkgPSB5KSkgKwogIGdlb21fbGluZShkYXRhID0gbGluZS5sb3dlciwgY29sb3IgPSAiZ3JlZW4iLCBhZXMoeCA9IHgsIHkgPSB5KSkKCQkj5Y6f5L2c6ICFYW5kcmV3NDPmj5DphpIKCQkjIOe0hem7nuihqOekuuWcqOeVjOWklu+8iGR0JGNvZGXlgLzngrpGQUxTRe+8ie+8jAoJCSMg57ag6bue6KGo56S65Zyo55WM5YWn77yIZHQkY29kZeWAvOeCulRSVUXvvInvvIwKCQkjIOeBsOm7nuihqOekuuS4jeiDveWIpOaWt++8iOS4iueVjOaIluS4i+eVjOS4jeWtmOWcqO+8m2R0JGNvZGXlgLzngrpOQe+8iQoKIyDmipPlj5ZuZXV0cmFsIGxvY2nvvIzku6V5ZXPngrrmipPlj5bln7rmupYKbmV1dHJhbCA8LSBzdWJzZXQoZHQsIGNvZGU9PSJUUlVFIikKb3V0bGllciA8LSBzdWJzZXQoZHQsIGNvZGU9PSJGQUxTRSIpCgojIOioiOeul+aVuOmHjyjlpJrnqK7mlrnlvI8pCmRpbShvdXRsaWVyKVsxXQpucm93KG91dGxpZXIpCmxlbmd0aChvdXRsaWVyWywxXSkKCiMg6Ly45Ye6CndyaXRlLnRhYmxlKG91dGxpZXIkaWQsIGZpbGU9Ii9Vc2Vycy9wYXRoL2xpc3QudHh0IiwgcXVvdGUgPSBGQUxTRSwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IEZBTFNFKQoKCgoKIyMg77yw77y077y05aSn56We55u45YqpIDIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaG93ZmViIOW7uuitsCBzcDo6cG9pbnQuaW4ucG9seWdvbiAKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgkKcmVxdWlyZShnZ3Bsb3QyKQpyZXF1aXJlKHNwKQoKbG9jaSA8LSByZWFkLnRhYmxlKCJsb2NpIGxpc3QgZWRpdCIsIGhlYWRlcj1UUlVFKQpjaSA8LSByZWFkLnRhYmxlKCJjaV9hZGQwIiwgaGVhZGVyPVRSVUUpCgoKZGY9ZGF0YS5mcmFtZShpZD1sb2NpJExvY3VzLCB4PWxvY2kkSGV0LCB5PWxvY2kkRnN0KSAgICAgICAgICAKCkxpbmUxPWRhdGEuZnJhbWUoeD1jaSRIZXQsIHk9Y2kkRnN0LCBnPSJMb3dlciIpCkxpbmUyPWRhdGEuZnJhbWUoeD1yZXYoY2kkSGV0KSx5PXJldihjaSRYMC41LjEucHZhbC5xdWFudGlsZSksZz0iVXBwZXIiKQpMaW5lZGY9cmJpbmQoTGluZTEsTGluZTIpCgpkZiRpbi5wZyA9IGlmZWxzZShhcy5sb2dpY2FsKHBvaW50LmluLnBvbHlnb24oZGYkeCwgZGYkeSwgcG9sLng9TGluZWRmJHgsIHBvbC55PUxpbmVkZiR5KSkKICAgICAgICAgICAgICAgICAgLCJZZXMiLCJObyIpCmhlYWQoZGYpCgpnZ3Bsb3QoKSsKICBnZW9tX3BvaW50KGFlcyh4PXgseT15LGNvbG91cj1pbi5wZyksZGF0YT1kZixpbmhlcml0LmFlcyA9IEYpKwogIGdlb21fcGF0aChhZXMoeD14LHk9eSxncm91cD1nLGNvbG91cj1nKSxzaXplPTEuMixkYXRhPUxpbmVkZixpbmhlcml0LmFlcyA9IEYpCgkJIyDms6jmhI/lpJrpgorlvaLnuaroo73nmoTpoIbluo/vvIzlsKTlhbZMaW5lMueVtuS4reeahHjoiId55pyJInJldiLvvIzlgJLluo/lvozmiY3lj6/ku6Xnuaroo73miJDlrozmlbTnmoTlpJrpgorlvaIKCQkjICDlj6/kvb/nlKjkuIvliJfmlrnlvI/ovLjlh7rlpJrpgorlvaLnorroqo3mmK/lkKbmraPnorogCgkJIwlwbG90Lm5ldygpCgkJIwlwb2x5Z29uKExpbmVkZiR4LCBMaW5lZGYkeSkKCiMg5oqT5Y+WbmV1dHJhbCBsb2Np77yM5LuleWVz54K65oqT5Y+W5Z+65rqWCm5ldXRyYWwgPC0gc3Vic2V0KGRmLCBpbi5wZz09IlllcyIpCm91dGxpZXIgPC0gc3Vic2V0KGRmLCBpbi5wZz09Ik5vIikKCiMg6KiI566X5pW46YePKOWkmueoruaWueW8jykKZGltKG91dGxpZXIpWzFdCm5yb3cob3V0bGllcikKbGVuZ3RoKG91dGxpZXJbLDFdKQoKIyDovLjlh7oKd3JpdGUudGFibGUob3V0bGllciRpZCwgZmlsZT0iL1VzZXJzL3BhdGgvbGlzdC50eHQiLCBxdW90ZSA9IEZBTFNFLCByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gRkFMU0Up