匹配数据框中的列(csv文件与另一个数据框csv文件的列,并添加新的列

时间:2015-02-19 10:49:40

标签: r dataframe multiple-columns bioinformatics matching

我有两个大数据帧(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中做这个的好方法吗?非常感谢你。

1 个答案:

答案 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。此外,您可以编写一个循环,其中包含这些行索引并将相应的值写入其他列。

这可能会给你一些想法。但这在大型数据集上效率不高。希望它能激发您正确的解决方案。不是像我这样的解决方法。