从R中的每一列中获取唯一值,跨所有列进行比较

soat7uwm  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(145)

我有一个数据集,看起来像这样(用于维恩图)。

genes <- paste("gene",1:1000,sep="")
x <- list(
  A = sample(genes,300), 
  B = sample(genes,525), 
  C = sample(genes,440),
  D = sample(genes,350)
  )

我想从每个列表中提取所有唯一的基因名称(A,B,C,D)。就像

A = gene100, gene667...
B = gene450, gene778...
C = gene359, gene889...
D = gene32, gene55...

这可以在Excel中通过条件格式设置所有列(向量列表为列(A,B,C,D))轻松完成。我需要它在R中继续进行其他分析。

a9wyjsp7

a9wyjsp71#

这里有一个R基的选项:

freq_overall <- table(unlist(x)) # Assumes no reptition within each sublist
# freq_overall <- table(unlist(lapply(x, unique))) # If repitition within sublists

uniq_genes   <- names(freq_overall)[freq_overall == 1L]
lapply(x, \(lst) intersect(lst, uniq_genes))

A更简洁但效率较低的选项:

lapply(names(x), \(l) setdiff(x[[l]], unlist(x[setdiff(names(x), l)])))
3zwtqj6y

3zwtqj6y2#

以下是purrr + dplyr的替代方案:

library(purrr)
library(dplyr)
x |> 
  map_dfr(as_tibble, .id = "col_name") |> 
  group_by(value) |> 
  filter(row_number() == 1) |> 
  ungroup() %>%
  split(.$col_name)

相关问题