我有两个大数据帧(csv格式),一个(df1)有这个结构
chromName fragStart fragEnd fragLength leftFragEndLength rightFragEndLength
Chr1 176 377 202 202 202
Chr1 472 746 275 275 275
Chr1 1276 1382 107 107 107
Chr1 1581 1761 181 173 4
Chr1 1890 2080 191 93 71
另一个(df2)包含5' target_id_start 5' target_id_end和3' target_id_start,3' target_id_end 一起的结果,它看起来像这样
Chr target_id_start target_id_end tot_counts uniq_counts est_counts
1 Chr1 10000016 10000066 0 0 0
2 Chr1 10000062 10000112 0 0 0
3 Chr1 10000171 10000221 0 0 0
4 Chr1 10000347 10000397 0 0 0
5 Chr1 1000041 1000091 0 0 0
我要做的是检查列target_id_start和target_id_end 是否介于或等于,列为fragStart和fragEnd。如果这是真的,那么我想在第一个文件df1中写入tot_counts uniq_counts est_counts列。对于5' target_id_start 5' target_id_end和3' target_id_start,3' target_id_end以及结果类似
chromName fragStart fragEnd fragLength leftFragEndLength rightFragEndLength tot_counts5' uniq_counts5' est_counts5' tot_counts3' uniq_counts3' est_counts3'
Chr1 176 377 202 202 202 0 0 0 0 0 0
Chr1 472 746 275 275 275 0 0 0 0 0 0
Chr1 1276 1382 107 107 107 0 0 0 0 0 0
Chr1 1581 1761 181 173 4 0 0 0 0 0 0
Chr1 1890 2080 191 93 71 0 0 0 0 0 0
你知道在R中做这个的好方法吗?非常感谢你。
答案 0 :(得分:0)
即使我真的讨厌循环,我能提供的最好的是:
a <- data.frame(x = c(1,10,100), y = c(2, 20, 200))
b <- data.frame(x = c(1.5, 30, 90, 150), y = c(1.6, 50, 101, 170), z = c("a","b","c", "d"))
a$z <= NA
for(i in 1:length(a$x)){
temp <- which((b$x >= a$x[i] & b$x <= a$y[i]) | (b$y >= a$x[i] & b$y <= a$y[i]))
a$z[i] <- ifelse(length(temp) > 0, temp, NA)
}
作为示例 - 循环写入数据帧b的行索引,其中a中的interval对应于b中的interval。此外,您可以编写一个循环,其中包含这些行索引并将相应的值写入其他列。
这可能会给你一些想法。但这在大型数据集上效率不高。希望它能激发您正确的解决方案。不是像我这样的解决方法。