R 拆分和配对两列的值

R 拆分和配对两列的值,r,split,row,bioinformatics,R,Split,Row,Bioinformatics,我有这样一个数据框: 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 Entry name Gene names A1BG_HUMAN A1BG M0R0

我有这样一个数据框:

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
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
在第一栏我有蛋白质的名字,在第二栏我有相关的基因。在一些蛋白质前面可以看到多个基因名称,它们基本上是该细胞中第一个基因的别名(由1个空格分隔)

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

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
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_人类面前,A1CF基因的不同别名出现了(ACF和ASP)。我不仅想将A1CF_人与ACF和ASP配对,还想将与A1CF基因相关的其他蛋白质(F8W9F8_人和Q5T0W7_人)与ACF和ASP配对。请看一下我上面想要的,以便更好地理解我到底在寻找什么。我不认为一个命令就能做到


假设第一个元素始终为“键”,其余为别名,则拆分基因名称,识别键,然后按键对所有别名进行分组,并将每个元素标准化以包含别名

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))

我们可以将
cSplit
data.table
一起使用。我们将“data.frame”转换为“data.table”(
setDT(df)
),从带有
sub的“Gene\u names”中提取第一个单词(
word(Gene\u names,1)
),使用
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感谢Martin的回复,但正如我所解释的,这并不完全是我感兴趣的。
我想将这个数据集转换成一种形式,每个蛋白质名称都与不同的基因名称配对,这样我就有了这样的东西:
这是
类似于
的东西,还是你只包含了一些组合对话?@Ali你能发布数据的dput吗?@akrun我没有直接回复你。我的帖子被标记了,我想说明我不是在寻找cSplit
的功能。我也回复了Martin的帖子。是的,这正是我想要的,只是行的顺序并不重要。Martin的回答很好,非常感谢感谢您的帮助。@Learner我的数据有大约70000行。上面部分的
dput
是:
结构(list(Entry.name=structure)(c(1L,8L,6L,9L,2L,7L,4L,5L,3L),.Label=c(“A1BG_人”,“A1CF_人”,“A2MG_人”,“F5H1E8_人”,“F8W7L3_人”,“f8w9f8f8_人”,“h0yf8_人”,“h1_人”,“M0R009	人”,“h1人”,“M0R009Ɛ人”),类系数),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))
非常感谢您的帮助!但是它没有给出我想要的结果。@Ali现在,它给出了你在帖子中显示的预期输出。但是,你可以自由地说它不起作用。哈哈,非常感谢!这一次效果和我预期的一样!:)不幸的是,我没有足够的声誉来支持你的答案。。。