我有这样一个数据框架:
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_HUMAN面前,引入了不同的A1CF基因别名(ACF & ASP)。我不仅要将A1CF_HUMAN与ACF和ASP配对,而且要对与A1CF基因(F8W9F8_HUMAN & Q5T0W7_HUMAN)相关的其他蛋白质与ACF和ASP进行配对。请看一看我上面想要的,以便更好地理解我到底在寻找什么。我不认为单靠一个命令就能做到。
发布于 2016-07-19 04:58:21
假设第一个元素总是' 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))
发布于 2016-07-19 06:54:10
我们可以将cSplit
与data.table
结合使用。我们将“data.frame”转换为“data.table”(setDT(df)
),从"Gene_names“和sub
中提取第一个单词( stringr
中的word(Gene_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 <- 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))
https://stackoverflow.com/questions/38449730
复制相似问题