【发布时间】:2012-04-10 19:02:43
【问题描述】:
我有以下数据:
df1 <- data.frame(chrom=c("chr1","chr2","chr5"),
start=c(10,20,30), end=c(100,200,300), stringsAsFactors=FALSE)
df2 <- data.frame(chrom=c("chr1","chr4","chr2","chr1"),
start=c(15,500,150,200), end=c(75,1000,300,300), stringsAsFactors=FALSE)
我想做以下事情:
for(i in 1:nrow(df2)) {
# only if this condition is true (i.e. if there is overlap)
if((df1$start <= df2$start && df1$end >= df2$start) ||
(df1$start >= df2$start && df1$start <= df2$end)) {
x <- df2[which(df2$chrom %in% df1$chrom),]
}
}
答案应该是:
df3 <- data.frame(chrom=c("chr1", "chr2"), start=c(15,150),
end=c(75,300), stringsAsFactors=FALSE)
抱歉给大家带来了困惑。
人们对我的查询非常有耐心,这是一次非常有帮助和学习的经历。但是我试图了解循环是如何工作的,我越想越困惑。例如:
for(i in 1:nrow(df2)) {
x <- df2[which(df2$chrom %in% df1$chrom),]
}
完全一样:
x <- df2[which(df2$chrom %in% df1$chrom),]
所以你甚至不需要循环。这怎么可能?我猜which 正在为你做循环?
【问题讨论】:
-
问题是什么? (除了我的,我看不到任何问号。)
-
循环就是循环,无论是 FORTRAN 还是 Julia。但你是对的,
[运算符可以做非常酷的事情。我可以推荐你阅读 R-inferno,burns-stat.com/pages/Tutor/R_inferno.pdf 吗? -
对于您的第二个问题,请查看您的 for 循环。你从不使用变量 i。这意味着您所做的只是一次又一次地重新分配
x <- df2[which(df2$chrom %in% df1$chrom),](所以它的作用当然与分配一次相同) -
我明白了。我从不使用 i 所以它甚至无法识别 for 循环。它只计算 x
-
我们已经在这个问题stackoverflow.com/questions/10083653/the-for-loop-aahh 中介绍了这个基础。你似乎没有把你在那里获得的东西应用到这里。我不明白这个问题与此有何不同;因为贾斯汀在这里的回答与我之前回答的问题基本相同。我相信这是一个重复的问题,因此投了反对票。
标签: r