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现在,它给出了你在帖子中显示的预期输出。但是,你可以自由地说它不起作用。哈哈,非常感谢!这一次效果和我预期的一样!:)不幸的是,我没有足够的声誉来支持你的答案。。。