【问题标题】:Optimizing the R code to write a record if a substring is present in a string如果字符串中存在子字符串,则优化 R 代码以写入记录
【发布时间】:2016-05-26 10:46:58
【问题描述】:

我有:

  1. 包含 ODB6_OD_ID、Gene_ID 和其他一些列的数据框 test_var。
  2. 具有架构编号、详细信息和序列的数据帧排列数据。 (序列数据不相关)

我想查明arranged_data$Details 是否包含来自test_var$ODB6_OD_ID 的任何值。也就是说,如果arranged_data$Details 中的字符串包含一个子字符串,该子字符串是test_var$ODB6_OD_ID 中的任何值。如果序列存在,则将相应 ODB6_OD_ID 的 test_var$Gene_ID 附加到文件中。

我必须为每个 architecture_number 执行此操作。大约有 18 种架构,总数据集为 5660。

这是我编写的代码,但它花费的时间太长,我认为这是因为大循环: (这仅适用于架构 1。我必须为 1-18 的架构做) (架构 1 包含大约 350 多个序列)

while (arranged_data$architecture_number==1)
 {
    if(grepl(arranged_data$V2,test_var$ODB6_OG_ID)==TRUE)
    {
        write.table(test_var$Gene_ID, file = "architecture1", append = TRUE, sep = '\n')
     }
}

我的数据集如下所示: 测试变量:

ODB6_OG_ID  start   Gene_ID
EOG60024F   chrXR_group6    FBgn0247618
EOG60024H   chr4_group3 FBgn0070413
EOG60024K   chr2    FBgn0078093
EOG60024M   chr2    FBgn0243975
EOG60024V   chr4_group5 FBgn0247694
EOG60025C   chrXL_group1a   FBgn0247949
EOG60025F   chr3    FBgn0245234
EOG602XCD   chr4_group3 FBgn0080574
EOG602XCQ   chr4_group3 FBgn0078791

arranged_data 包含:

architecture_number    Details
1    chr317678741767875EOG6HQF5814.8092+47
1    chr325176942517695EOG6NKCGX23.1869-87
1    chr391494069149407EOG6NZVDZ2.96183+105
1    chr246642624664263EOG6Z638J1.52323+138
1    chr4_group3231407231408EOG6QRHQP4.65431-721
1    chr311648221164823EOG6X3HNJ2.28484+96
1    chr333466933346694EOG66WZW582.1698+678
1    chrXR_group854636745463675EOG6XH0KP1.86172+57
1    chr283746518374652EOG6V17MG2.45409-68
1    chr31338293913382940EOG63XVQR1.60785+105

需要的输出: FBgn0247618 FBgn0070413 FBgn0078093等

(这些不按顺序排列。)

其他信息: 操作系统:Ubuntu Xenial Xerus 16.04 R版本:3.3.0 RStudio 版本:0.99.902

【问题讨论】:

  • 请提供minimal reproducible example。此外,将数据保存在数据帧中,然后写入磁盘可能比每次迭代写入磁盘要快。

标签: r string dataframe substring


【解决方案1】:

这是一个想法,

df$new <- gsub('_.*', '', df$start)
df1$new <- ifelse(grepl('_', df1$Details), gsub('_.*', '', df1$Details), 
                                                   substring(df1$Details, 1, 4))

df1$Gene_ID <- sapply(df1$new, function(i) df$Gene_ID[match(i, df$new)])

df1
#   architecture_number                                       Details   new     Gene_ID
#1                    1         chr317678741767875EOG6HQF5814.8092+47  chr3 FBgn0245234
#2                    1         chr325176942517695EOG6NKCGX23.1869-87  chr3 FBgn0245234
#3                    1        chr391494069149407EOG6NZVDZ2.96183+105  chr3 FBgn0245234
#4                    1        chr246642624664263EOG6Z638J1.52323+138  chr2 FBgn0078093
#5                    1   chr4_group3231407231408EOG6QRHQP4.65431-721  chr4 FBgn0070413
#6                    1         chr311648221164823EOG6X3HNJ2.28484+96  chr3 FBgn0245234
#7                    1        chr333466933346694EOG66WZW582.1698+678  chr3 FBgn0245234
#8                    1 chrXR_group854636745463675EOG6XH0KP1.86172+57 chrXR FBgn0247618
#9                    1         chr283746518374652EOG6V17MG2.45409-68  chr2 FBgn0078093
#10                   1      chr31338293913382940EOG63XVQR1.60785+105  chr3 FBgn0245234

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-08
    • 2021-12-28
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多