【问题标题】:Splitting and pairing the values of two columns拆分和配对两列的值
【发布时间】:2016-07-19 04:43:43
【问题描述】:

我有一个这样的数据框:

Entry name  Gene names
A1BG_HUMAN      A1BG
M0R009_HUMAN    A1BG
F8W9F8_HUMAN    A1CF
Q5T0W7_HUMAN    A1CF
A1CF_HUMAN      A1CF ACF ASP
H0YFH1_HUMAN    A2M
A2MG_HUMAN      A2M CPAMD5 FWP007

第一列是蛋白质名称,第二列是相关基因。在一些蛋白质前面可以看到多个基因名称,基本上是该细胞中第一个基因的别名(用1个空格分隔)。

我想把这个数据集转换成每个蛋白质名称都与不同基因名称配对的形式,所以我有这样的东西:

Entry name  Gene names
A1BG_HUMAN      A1BG
M0R009_HUMAN    A1BG
F8W9F8_HUMAN    A1CF
F8W9F8_HUMAN    ACF
F8W9F8_HUMAN    ASP
Q5T0W7_HUMAN    A1CF
Q5T0W7_HUMAN    ACF
Q5T0W7_HUMAN    ASP
A1CF_HUMAN      A1CF
A1CF_HUMAN      ACF
A1CF_HUMAN      ASP
H0YFH1_HUMAN    A2M
H0YFH1_HUMAN    CPAMD5
H0YFH1_HUMAN    FWP007
A2MG_HUMAN      A2M
A2MG_HUMAN      CPAMD5
A2MG_HUMAN      FWP007

我知道如何将具有多个条目的单元格拆分为不同的行,但我不确定如何将第一列中的蛋白质与基因的不同别名配对。

有人知道怎么做吗?

编辑:我不想只将数据拆分为不同的行。所以 cSplit 实际上不会在这里帮助我。我举个例子:

在A1CF_HUMAN前面,带来了A1CF基因的不同别名(ACF & ASP)。我不仅想将 A1CF_HUMAN 与 ACF 和 ASP 配对,而且还将与 A1CF 基因(F8W9F8_HUMAN 和 Q5T0W7_HUMAN)相关的其他蛋白质与 ACF 和 ASP 配对。请看一下上面我想要的内容,以更好地了解我到底在寻找什么。我不认为它可以通过一个命令来完成。

【问题讨论】:

  • I want to convert this data set to a form which every protein name is paired with different gene names, so that I have sth like this: sth like 是您预期的确切输出还是您只是包含了一些组合?
  • @Ali 你能发布你的数据吗?
  • @akrun 我没有直接回复你。我的帖子被标记了,我想说明我不是在寻找 cSplit 的作用。我也回复了马丁的帖子。是的,这正是我想要的,只是行的顺序并不重要。马丁的回答很有效,非常感谢您的帮助。
  • @Learner 我的数据有大约 70,000 行。以上部分的dput为:structure(list(Entry.name = structure(c(1L, 8L, 6L, 9L, 2L, 7L, 4L, 5L, 3L), .Label = c("A1BG_HUMAN", "A1CF_HUMAN", "A2MG_HUMAN", "F5H1E8_HUMAN", "F8W7L3_HUMAN", "F8W9F8_HUMAN", "H0YFH1_HUMAN", "M0R009_HUMAN", "Q5T0W7_HUMAN"), class = "factor"), Gene.names = structure(c(1L, 1L, 2L, 2L, 3L, 4L, 4L, 4L, 5L), .Label = c("A1BG", "A1CF", "A1CF ACF ASP", "A2M", "A2M CPAMD5 FWP007"), class = "factor")), .Names = c("Entry.name", "Gene.names"), class = "data.frame", row.names = c(NA, -9L))

标签: r split row bioinformatics


【解决方案1】:

假设第一个元素总是'key',其余的都是别名,拆分基因名称,识别键,然后按键对所有别名进行分组,并将每个元素标准化以包含别名

elts = strsplit(df$Gene_names, " ")
keys = sapply(elts, "[[", 1)
values = split(unlist(elts), rep(keys, lengths(elts)))
df$Gene_names = lapply(values, unique)[keys]

使用每个标准化基因名称的长度来复制条目名称,并将这些名称与未列出的拆分基因名称匹配

data.frame(
    Entry_name = rep(df$Entry_name, lengths(df$Gene_names)),
    Gene_name = unlist(df$Gene_names))

【讨论】:

  • 感谢 Martin 的回复,但正如我所解释的,这并不是我真正感兴趣的。
【解决方案2】:

我们可以使用cSplitdata.table。我们将 'data.frame' 转换为 'data.table' (setDT(df)),使用 sub 从 'Gene_names' 中提取第一个单词(word(Gene_names,1) from stringr 也应该有效),使用获取逻辑索引duplicated,我们使用逻辑向量的累积和作为分组变量,并将“Gene_names”分配给字符最长的那个。然后,使用cSplit 将其转换为'long'格式。

library(splitstackshape)
library(data.table)
setDT(df)[, Gene_names := Gene_names[which.max(nchar(Gene_names))] , 
           cumsum(!duplicated(sub("\\s+.*", "", Gene_names)))][]
cSplit(df, "Gene_names", " ", "long")
#      Entry_name Gene_names
# 1:   A1BG_HUMAN       A1BG
# 2: M0R009_HUMAN       A1BG
# 3: F8W9F8_HUMAN       A1CF
# 4: F8W9F8_HUMAN        ACF
# 5: F8W9F8_HUMAN        ASP
# 6: Q5T0W7_HUMAN       A1CF
# 7: Q5T0W7_HUMAN        ACF
# 8: Q5T0W7_HUMAN        ASP
# 9:   A1CF_HUMAN       A1CF
#10:   A1CF_HUMAN        ACF
#11:   A1CF_HUMAN        ASP
#12: H0YFH1_HUMAN        A2M
#13: H0YFH1_HUMAN     CPAMD5
#14: H0YFH1_HUMAN     FWP007
#15:   A2MG_HUMAN        A2M
#16:   A2MG_HUMAN     CPAMD5
#17:   A2MG_HUMAN     FWP007

数据

df <- structure(list(Entry_name = c("A1BG_HUMAN", "M0R009_HUMAN", 
"F8W9F8_HUMAN", 
"Q5T0W7_HUMAN", "A1CF_HUMAN", "H0YFH1_HUMAN", "A2MG_HUMAN"), 
Gene_names = c("A1BG", "A1BG", "A1CF ACF ASP", "A1CF ACF ASP", 
"A1CF ACF ASP", "A2M CPAMD5 FWP007", "A2M CPAMD5 FWP007")),
.Names = c("Entry_name", 
"Gene_names"), class = "data.frame", row.names = c(NA, -7L))

【讨论】:

  • 非常感谢您的帮助!但它并没有给我想要的结果。
  • @Ali 现在,它确实提供了您在帖子中显示的预期输出。但是,你可以说它不起作用。
  • 哈哈非常感谢!这次它按我的预期工作! :) 不幸的是,我没有足够的声誉来支持你的答案......
猜你喜欢
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2012-01-24
  • 2011-11-23
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多