很抱歉,如果这是一个非常基本的问题,但是在我的R项目上工作时遇到了一个问题。基本上我有两个数据框对象,一个是基因及其在各种患者中的表达水平的主列表,另一个是只有一列的大小。然后,只有一列的是属于特定子基因类别的基因列表,所有这些子类别均在主列表中。我正在尝试创建一个数据框,其中包含特定的基因子集以及它们在不同患者中的表达,这些信息包含在主列表中。我尝试使用merge()函数,但是只创建了一个空的数据框。
基本上,代码类似于:new_dataframe <-merge(master_list,specific_gene_list,by =“ gene”)。我以为这段代码应该查看我的主列表,找到特定列表中的所有基因,然后只获取那些基因并添加用于患者表达的列,但是我的数据框为空,它创建了一个包含主列表中所有列的数据框列表,但未填写任何值。非常感谢您的帮助。
一个视觉示例:
主数据框
x:1
y:3
z:4
w:6
特定数据框:
x
y
所需的数据帧:
x:1
y:3
答案 0 :(得分:2)
我们可以使用regex_inner_join
中的fuzzyjoin
library(fuzzyjoin)
df3 <- regex_inner_join(df1, df2, by = 'gene') %>%
transmute(gene = gene.x)
df3
# gene
#1 x: 1
#2 y: 3
df1 <- structure(list(gene = c("x: 1", "y: 3", "z: 4", "w: 6")),
class = "data.frame", row.names = c(NA,
-4L))
df2 <- structure(list(gene = c("x", "y")), class = "data.frame", row.names = c(NA,
-2L))
答案 1 :(得分:0)
您还可以按冒号分隔列,并添加新列以合并数据框。
mergecol <- c("x: 1",
"y: 3",
"z: 4",
"w: 6")
df <- cbind(mergecol, as.data.frame(do.call(rbind, strsplit(mergecol, ':'))))
df2 <- data.frame(V1 = c('x', 'y'))
mergedf <- merge(df, df2, by="V1")
result <- c('x: 1', 'y: 3')
assertthat::are_equal(result, mergedf$mergecol)
#[1] TRUE
答案 2 :(得分:0)
您可以使用master_list
分隔separate
中的列,与specific_gene_list
合并,然后再次将列与unite
合并。
library(dplyr)
library(tidyr)
master_list %>%
separate(gene, c('gene', 'value'), sep = ':\\s*') %>%
inner_join(specific_gene_list, by = 'gene') %>%
unite(gene, gene, value, sep = " : ")
# gene
#1 x : 1
#2 y : 3