获取 R 数据框中的列字符串之间的差异

Get difference between column strings in R dataframe

我有一个关于 R 的基本问题:

考虑到我有一个数据框,其中每一列代表两个样本的核苷酸突变集 'major' 和 'minor'

major <- c("T2A,C26T,G652A")
minor <- c("T2A,C26T,G652A,C725T")

df <- data.frame(major,minor)
tibble(df)

#A tibble: 1 x 2
  major          minor               
  <chr>          <chr>               
1 T2A,C26T,G652A T2A,C26T,G652A,C725T

我想确定 'minor' 中存在但 'major' 中不存在的突变。

我知道如果那些 'major' 和 'minor' 突变是存储的向量,我可以使用 setdiff 来获得这种差异,但是,我收到的数据存储为一个长字符串,其中包含一些以逗号分隔的突变,我不知道如何将此列字符串转换为数据框中的列向量以获得这种差异(我试过但没有成功)。

直接在列中使用 setdiff:

setdiff(df$minor, df$major)
# I got
[1] "T2A C26T G652A C725T"

预期结果是:

C725T

谁能帮帮我?

最佳,

最简单的方法;将 majorminor 定义为字符向量

major <- c("T2A", "C26T", "G652A")

minor <- c("T2A", "C26T", "G652A", "C725T")

然后

df <- tibble(major, minor)
setdiff(df$minor, df$major)
#> "C725T"

如果无法将主要和次要拆分为字符向量,您可以使用 stringr 包来完成这项工作。

library(stringr)

major <- c("T2A,C26T,G652A")
minor <- c("T2A,C26T,G652A,C725T")

df <- tibble(
  major = str_split(major, pattern = ",", simplify = TRUE), 
  minor = str_split(minor, pattern = ",", simplify = TRUE)
)

setdiff(df$minor, df$major)
#> "C725T"

这适用于 multi-row 数据框,按行进行比较:

library(dplyr)
major <- c("T2A,C26T,G652A", "world")
minor <- c("T2A,C26T,G652A,C725T", "hello,world")

df <- data.frame(major,minor)

df %>%
  mutate(
    across(c(major, minor), strsplit, split = ",")
  ) %>%
  mutate(
    diff = mapply(setdiff, minor, major)
  )
#              major                   minor  diff
# 1 T2A, C26T, G652A T2A, C26T, G652A, C725T C725T
# 2            world            hello, world hello

请注意,它确实修改了 majorminor 列,将它们变成列表列,每行包含字符向量。如果您需要保留原件,可以使用 .names 参数来 across