R 基于多个匹配项修改映射表
我有一个具有此结构的地图表:R 基于多个匹配项修改映射表,r,R,我有一个具有此结构的地图表: structure(list(REF_ID = structure(1:10, .Label = c("202533_s_at", "202534_x_at", "202551_s_at", "202552_s_at", "202555_s_at", "202565_s_at", "202566_s_at", "202580_x_at", "202581_at", "202589_at"), class = "factor"), GeneSymb
structure(list(REF_ID = structure(1:10, .Label = c("202533_s_at",
"202534_x_at", "202551_s_at", "202552_s_at", "202555_s_at", "202565_s_at",
"202566_s_at", "202580_x_at", "202581_at", "202589_at"), class = "factor"),
GeneSymbol = structure(c(2L, 2L, 1L, 1L, 5L, 6L, 6L, 3L, 4L, 7L), .Label =
c("CRIM1 /// LOC101929500", "DHFR", "FOXM1", "HSPA1A /// HSPA1B", "MYLK",
"SVIL", "TYMS"), class = "factor")), .Names = c("REF_ID", "GeneSymbol"),
class = "data.frame", row.names = c(NA, -10L))
在第3、4和9行中,有多个与单个REF\u ID
匹配的GeneSymbol
。(此处/
是分隔符)。因此,在第3行中,两个基因符号与一个REF\u ID
匹配
我想要一个修改过的表(包括所有现有的映射),这样REF\u ID
将重复与单独的基因符号匹配的次数。因此,我希望第3行中有两行单独的条目:一行的
REF_ID==202551_s_at
和GeneSymbol==CRIM1
,另一行的REF_ID==202551_at
和GeneSymbol==LOC101929500
你能帮我个忙吗。下面是你想要的。它只使用基本R,也许在
tidyverse
中有更简单的解决方案
map$GeneSymbol <- as.character(map$GeneSymbol)
out <- lapply(seq_along(map$GeneSymbol), function(i){
g <- map$GeneSymbol[i]
if(grepl("///", g)){
g <- trimws(unlist(strsplit(g, "///")))
data.frame(REF_ID = rep(map$REF_ID[i], length(g)), GeneSymbol = g)
} else {
data.frame(REF_ID = map$REF_ID[i], GeneSymbol = g)
}
})
map$GeneSymbol <- as.factor(map$GeneSymbol)
out <- do.call(rbind, out)
out
# REF_ID GeneSymbol
#1 202533_s_at DHFR
#2 202534_x_at DHFR
#3 202551_s_at CRIM1
#4 202551_s_at LOC101929500
#5 202552_s_at CRIM1
#6 202552_s_at LOC101929500
#7 202555_s_at MYLK
#8 202565_s_at SVIL
#9 202566_s_at SVIL
#10 202580_x_at FOXM1
#11 202581_at HSPA1A
#12 202581_at HSPA1B
#13 202589_at TYMS
map$GeneSymbol为了补充Rui Barradas的答案,一种tidyverse方法可能是使用tidyr
包中包含的separate_rows()
:
库(tidyverse)
df%>%单独的行(genesymble,sep=“/”)
#>参考ID GeneSymbol
#>1 202533_s_在DHFR
#>2 202534_x_在DHFR
#>3 202551_s_在克里米亚1
#>4位置101929500处的202551_s_
#>5 202552_s_在克里米亚1
#>6位置101929500处的202552_s_
#>MYLK 202555_s_
#>SVIL 202565_s_
#>9斯维尔202566_s_
#>10 FOXM1处202580_x_
#>HSPA1A的11 202581_
#>HSPA1B的12 202581_
#>TYMS的13 202589_
数据
df非常感谢@芮Barradas@J.Smith我意识到在点击发布后使用length(g)
可能会改善答案,但后来我认为只有一个//
,因此g
总是被一分为二。无论如何,您的编辑确实使答案更一般。谢谢。哇!!!非常感谢。。。