这是一个R问题。
我有两个矩阵," y"和" l":
> head(y)
SNP Category
1 29351 exclude
2 29357 exclude
3 29360 exclude
4 29372 include
5 29426 include
6 29432 include
> head(l)
start stop
1 246 11012
2 11494 13979
3 14309 18422
4 20728 20995
5 21457 29345
6 30035 31693
如果矩阵y中的行具有值"包括"在第二列中,我想检查矩阵y中第一列中的相应值是否位于" start"并且"停止"矩阵中的值l。如果矩阵y中的值确实位于矩阵l中的值之间或之间,则在矩阵y中替换值" include"用"排除"。我想我可以用嵌套for循环来做,但想知道更优雅和更快的方式。矩阵的长度不等。谢谢。
答案 0 :(得分:0)
这很有效,但很慢。
y <- read.csv(file="SNP_pos_categorised0.99cutoff.csv", header=T)
l <- read.csv("SNPsToMoveFromINCLUDEtoEXCLUDE.csv", header=T)
colnames(y)
#[1] "SNP" "Category"
levels(y$Category)
#[1] " exclude" " include"
colnames(l)
#[1] "start" "stop"
#start processing
for(i in 1:nrow(y))
{
if(y[i,"Category"]==" include")
{
for(j in 1:nrow(l))
{
if(y[i,"SNP"] >= l[j,"start"] & y[i,"SNP"]<= l[j,"stop"])
{
y[i, "Category"] <- replace(y[i,"Category"], y[i,"Category"]==" include", " exclude" )
}
}
}
}