AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79568981
Accepted
Paolo Lorenzini
Paolo Lorenzini
Asked: 2025-04-11 21:42:20 +0800 CST2025-04-11 21:42:20 +0800 CST 2025-04-11 21:42:20 +0800 CST

在数据框上按行应用具有两个参数的函数

  • 772

我有一个参考和查询序列:

ref_seq <- "ATTT"
df <- data.frame(V1=c("AATT", "TTTT", "GGTT"))

我想返回与参考相比每个查询序列中不匹配的位置:

seqdiff <- function(seq1, seq2) {
  seq <- strsplit(c(seq1, seq2), split= '')
  mismatches <- which(seq[[1]] != seq[[2]])
  return(mismatches)
}
    
apply(X=df, MARGIN=2, function(x) seqdiff(x, ref_seq))

#      V1
# [1,]  1
# [2,]  2

预期输出:

#      V1
# [1,]  2
# [2,]  1
# [3,]  1 2
  • 5 5 个回答
  • 80 Views

5 个回答

  • Voted
  1. Best Answer
    Ben
    2025-04-12T03:28:15+08:002025-04-12T03:28:15+08:00

    鉴于这些可能是核苷酸序列,您可以考虑该adist函数。在其他情况下,它可以用于确定将一个字符串转换为另一个字符串所需的最小插入、删除和替换的加权次数。这允许在转换过程中计算计数,以及“trafos”属性中的转换序列(M = 匹配,I = 插入,D = 删除,S = 替换)。

    df$trafos <- attr(adist(df$V1, ref_seq, counts = TRUE), "trafos")
    df$substitution <- gregexpr("S", df$trafos)
    df
    
        V1 trafos substitution
    1 AATT   MSMM            2
    2 TTTT   SMMM            1
    3 GGTT   SSMM         1, 2
    
    • 5
  2. G. Grothendieck
    2025-04-11T21:52:15+08:002025-04-11T21:52:15+08:00

    1)这将生成一个数据框,其mismatch列是向量列表。

    library(dplyr)
    out <- df %>%
      rowwise %>%
      mutate(mismatch = list(seqdiff(V1, ref_seq))) %>%
      ungroup
    
    str(out)
    ## tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
    ##  $ V1      : chr [1:3] "AATT" "TTTT" "GGTT"
    ##  $ mismatch:List of 3
    ##   ..$ : int 2
    ##   ..$ : int 1
    ##   ..$ : int [1:2] 1 2
    
    str(out$mismatch)
    ## List of 3
    ##  $ : int 2
    ##  $ : int 1
    ##  $ : int [1:2] 1 2
    
    

    2)mismatch除了列是字符向量之外,这个是相同的。

    library(dplyr)
    
    out <- df %>%
      rowwise %>%
      mutate(mismatch = toString(seqdiff(V1, ref_seq))) %>%
      ungroup
    out
    ## # A tibble: 3 × 2
    ##   V1    mismatch
    ##   <chr> <chr>   
    ## 1 AATT  2       
    ## 2 TTTT  1       
    ## 3 GGTT  1, 2    
    

    3)这解除了(1)的嵌套,给出了一个长格式数据框,其中每个输入行的输出可以跨越多个输出行。

    library(dplyr)
    library(tidyr)
    
    out <- df %>%
      rowwise %>%
      mutate(mismatch = list(seqdiff(V1, ref_seq))) %>%
      ungroup %>%
      unnest(mismatch)
    out
    ## A tibble: 4 × 2
    ##   V1    mismatch
    ##   <chr>    <int>
    ## 1 AATT         2
    ## 2 TTTT         1
    ## 3 GGTT         1
    ## 4 GGTT         2
    
    library(igraph)
    
    set.seed(123)
    g <- graph_from_data_frame(out)
    plot(g)
    

    (图片后继续) 截屏

    4)要使用apply该功能,应使用list或toString

    out <- apply(df, 1, \(x) list(seqdiff(x, ref_seq)))
    str(out)
    List of 3
     $ :List of 1
      ..$ : int 2
     $ :List of 1
      ..$ : int 1
     $ :List of 1
      ..$ : int [1:2] 1 2
    
    out <- apply(df, 1, \(x) toString(seqdiff(x, ref_seq)))
    out
    ## [1] "2"    "1"    "1, 2"
    
    • 1
  3. Andre Wildberg
    2025-04-11T23:40:47+08:002025-04-11T23:40:47+08:00

    一种方法substr

    sapply(df$V1, \(seq) 
      which(sapply(seq_len(nchar(ref_seq)), \(x) 
        substr(ref_seq, x, x) != substr(seq, x, x))))
    $AATT
    [1] 2
    
    $TTTT
    [1] 1
    
    $GGTT
    [1] 1 2
    

    如果您只想匹配特定位置,请在ref_seq中使用空格,例如

    ref_seq <- " GTA"
    
    sapply(df$V1, \(seq) 
      which(sapply(seq_len(nchar(ref_seq)), \(x) 
        substr(ref_seq, x, x) != substr(seq, x, x) & 
        (substr(ref_seq,x ,x) != " "))))
    $AATT
    [1] 2 4
    
    $TTTT
    [1] 2 4
    
    $GGTT
    [1] 4
    

    以数据框格式获取结果

    as.matrix(lapply(df$V1, \(seq)
      which(sapply(seq_len(nchar(ref_seq)), \(x)
        substr(ref_seq, x, x) != substr(seq, x, x))))) |>
      `colnames<-`(ref_seq) |>
      data.frame()
      ATTT
    1    2
    2    1
    3 1, 2
    
    • 1
  4. Friede
    2025-04-12T00:39:17+08:002025-04-12T00:39:17+08:00

    如果nchar的ref_seq和的所有元素的V1长度相同,我们可以尝试vapply(),utf8ToInt()其中which()。

    M = vapply(V1, utf8ToInt, numeric(4)) 
    i = which(M != utf8ToInt(ref_seq), arr.ind = TRUE)
    V2 = with(data.frame(i),  split(row, col)) |> sapply(toString)
    
    > data.frame(V1, V2)
        V1   V2
    1 AATT    2
    2 TTTT    1
    3 GGTT 1, 2
    

    从i到 的强制转换V2可以改进;我还没有更好的主意。


    笔记

    # input data
    ref_seq = "ATTT"
    V1 = c("AATT", "TTTT","GGTT")
    
    • 0
  5. jay.sf
    2025-04-12T12:36:51+08:002025-04-12T12:36:51+08:00

    您可以使用!=并mapply解析TRUE位置toString。

    > s <- \(x) {strsplit(x, '')}
    > apply(mapply(`!=`, s(ref_seq), s(df$V1)), 2, \(x) toString(which(x)))
    [1] "2"    "1"    "1, 2"
    

    注意:避免对 s 进行逐行操作data.frame,这非常低效。记住, adata.frame实际上是一串向量,相邻位置显示为行——因此可以考虑使用mapply()或Map()。apply()是为矩阵设计的(正如本解决方案中应用的那样),很少(甚至根本不)用于data.frames。

    • 0

相关问题

  • 将复制活动的序列号添加到 Blob

  • Packer 动态源重复工件

  • 选择每组连续 1 的行

  • 图形 API 调用列表 subscribedSkus 状态权限不足,但已授予权限

  • 根据列值创建单独的 DF 的函数

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve