首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分裂和配对两列的值

分裂和配对两列的值
EN

Stack Overflow用户
提问于 2016-07-19 04:43:43
回答 2查看 179关注 0票数 2

我有这样一个数据框架:

代码语言:javascript
运行
复制
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

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

我想把这组数据转换成每一个蛋白质名称都与不同的基因名称配对的形式,这样我就有了如下的东西:

代码语言:javascript
运行
复制
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进行配对。请看一看我上面想要的,以便更好地理解我到底在寻找什么。我不认为单靠一个命令就能做到。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-19 04:58:21

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

代码语言:javascript
运行
复制
elts = strsplit(df$Gene_names, " ")
keys = sapply(elts, "[[", 1)
values = split(unlist(elts), rep(keys, lengths(elts)))
df$Gene_names = lapply(values, unique)[keys]

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

代码语言:javascript
运行
复制
data.frame(
    Entry_name = rep(df$Entry_name, lengths(df$Gene_names)),
    Gene_name = unlist(df$Gene_names))
票数 2
EN

Stack Overflow用户

发布于 2016-07-19 06:54:10

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

代码语言:javascript
运行
复制
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

数据

代码语言:javascript
运行
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38449730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档