如何从 table 中查找值并插入查找列表的名称?
How to look up values from a table and insert name of the lookup-list?
我有一个这样的(样本)table:
df <- read.table(header = TRUE,
stringsAsFactors = FALSE,
text="Gene SYMBOL Values
TP53 2 3.55
XBP1 5 4.06
TP27 1 2.53
REDD1 4 3.99
ERO1L 6 5.02
STK11 9 3.64
HIF2A 8 2.96")
我想查找来自两个不同基因列表的符号,此处为基因列表 1 和基因列表 2:
genelist1 <- read.table(header = TRUE,
stringsAsFactors = FALSE,
text="Gene SYMBOL
P4H 10
PLK 7
TP27 1
KTD 11
ERO1L 6")
genelist2 <- read.table(header = TRUE,
stringsAsFactors = FALSE,
text="Gene SYMBOL
TP53 2
XBP1 5
BHLHB 12
STK11 9
TP27 1
UPK 18")
我想要的是获得一个新的专栏,我可以在其中看到我可以在我的数据框中找到每个基因的基因列表,但是当我 运行 以下代码时,它只是在新列中重复的符号。
df_geneinfo <- df %>%
join(genelist1,by="SYMBOL") %>%
join(genelist2, by="SYMBOL")
关于如何解决这个问题的任何建议,是用基因列表的名称创建一个新列,还是为每个基因列表创建一个列?
提前致谢! :)
我刚刚编写了自己的函数,它替换了列值:
replace_by_lookuptable <- function(df, col, lookup) {
assertthat::assert_that(all(col %in% names(df))) # all cols exist in df
assertthat::assert_that(all(c("new", "old") %in% colnames(lookup)))
cond_na_exists <- is.na(unlist(lapply(df[, col], function(x) my_match(x, lookup$old))))
assertthat::assert_that(!any(cond_na_exists))
df[, col] <- unlist(lapply(df[, col], function(x) lookup$new[my_match(x, lookup$old)]))
return(df)
}
df
是 data.frame,col
是列名向量,应使用 lookup
替换,data.frame 与列 "old" 和 "new".
如果您在基因列表中添加 listid
列
genelist1$listid = 1
genelist2$listid = 2
然后您可以将您的 df 与基因列表合并:
merge(df,rbind(genelist1,genelist2),all.x=T, by = "SYMBOL")
请注意,ERO1L 在你的 df 中是符号 6,在基因列表 1 中是 4,基因列表中缺少 HIF2A 和 REDD1,但 REDD1 在你的 df 中是符号 4(在 genlist1 中是 ERO1L ...所以我不是确定您在那种情况下期望的输出。
您也可以只合并基因名称:
merge(df,rbind(genelist1,genelist2),all.x=T, by.x = "Gene", by.y= "Gene")
您可以将所有的基因列表放在 list
:
gen_list <- list(genelist1 = genelist1,genelist2 = genelist2)
并将它们与您的目标进行比较 data.frame
:
cbind(df,do.call(cbind,lapply(seq_along(gen_list),function(x) ifelse( df$Gene %in% gen_list[[x]]$Gene,names(gen_list[x]),NA))))
为了完整性(以及大表的性能,也许),这是一个 data.table
方法:
library(data.table)
rbindlist(list(genelist1, genelist2), idcol = "glid")[, -"Gene"][
setDT(df), on = "SYMBOL"][, .(glid = toString(glid)), by = .(Gene, SYMBOL, Values)][]
Gene SYMBOL Values glid
1: TP53 2 3.55 2
2: XBP1 5 4.06 2
3: TP27 1 2.53 1, 2
4: REDD1 4 3.99 1
5: ERO1L 6 5.02 NA
6: STK11 9 3.64 2
7: HIF2A 8 2.96 NA
rbindlist()
从所有基因列表中创建一个 data.table
并添加一列 glid
以标识每一行的来源。 Gene
列被忽略,因为后续联接仅在 SYMBOL
上进行。在加入之前,df
使用 setDT()
被强制转换为 class data.table
。然后通过 SYMBOL
聚合合并的结果,以显示符号出现在两个基因列表中的情况,即 SYMBOL == 1
.
的情况
编辑
如果有很多基因列表或者需要基因列表的全名而不是数字,我们可以试试这个:
rbindlist(mget(ls(pattern = "^genelist")), idcol = "glid")[, -"Gene"][
setDT(df), on = "SYMBOL"][, .(glid = toString(glid)), by = .(Gene, SYMBOL, Values)][]
Gene SYMBOL Values glid
1: TP53 2 3.55 genelist2
2: XBP1 5 4.06 genelist2
3: TP27 1 2.53 genelist1, genelist2
4: REDD1 4 3.99 NA
5: ERO1L 6 5.02 genelist1
6: STK11 9 3.64 genelist2
7: HIF2A 8 2.96 NA
ls()
正在环境中查找名称以 genelist...
开头的对象。 mget()
returns 传递给 rbindlist()
.
的那些对象的命名列表
数据
由 OP 提供
df <- structure(list(Gene = c("TP53", "XBP1", "TP27", "REDD1", "ERO1L",
"STK11", "HIF2A"), SYMBOL = c(2L, 5L, 1L, 4L, 6L, 9L, 8L), Values = c(3.55,
4.06, 2.53, 3.99, 5.02, 3.64, 2.96)), .Names = c("Gene", "SYMBOL",
"Values"), class = "data.frame", row.names = c(NA, -7L))
genelist1 <- structure(list(Gene = c("P4H", "PLK", "TP27", "KTD", "ERO1L"),
SYMBOL = c(10L, 7L, 1L, 11L, 4L)), .Names = c("Gene", "SYMBOL"
), class = "data.frame", row.names = c(NA, -5L))
genelist2 <- structure(list(Gene = c("TP53", "XBP1", "BHLHB", "STK11", "TP27",
"UPK"), SYMBOL = c(2L, 5L, 12L, 9L, 1L, 18L)), .Names = c("Gene",
"SYMBOL"), class = "data.frame", row.names = c(NA, -6L))
我有一个这样的(样本)table:
df <- read.table(header = TRUE,
stringsAsFactors = FALSE,
text="Gene SYMBOL Values
TP53 2 3.55
XBP1 5 4.06
TP27 1 2.53
REDD1 4 3.99
ERO1L 6 5.02
STK11 9 3.64
HIF2A 8 2.96")
我想查找来自两个不同基因列表的符号,此处为基因列表 1 和基因列表 2:
genelist1 <- read.table(header = TRUE,
stringsAsFactors = FALSE,
text="Gene SYMBOL
P4H 10
PLK 7
TP27 1
KTD 11
ERO1L 6")
genelist2 <- read.table(header = TRUE,
stringsAsFactors = FALSE,
text="Gene SYMBOL
TP53 2
XBP1 5
BHLHB 12
STK11 9
TP27 1
UPK 18")
我想要的是获得一个新的专栏,我可以在其中看到我可以在我的数据框中找到每个基因的基因列表,但是当我 运行 以下代码时,它只是在新列中重复的符号。
df_geneinfo <- df %>%
join(genelist1,by="SYMBOL") %>%
join(genelist2, by="SYMBOL")
关于如何解决这个问题的任何建议,是用基因列表的名称创建一个新列,还是为每个基因列表创建一个列?
提前致谢! :)
我刚刚编写了自己的函数,它替换了列值:
replace_by_lookuptable <- function(df, col, lookup) {
assertthat::assert_that(all(col %in% names(df))) # all cols exist in df
assertthat::assert_that(all(c("new", "old") %in% colnames(lookup)))
cond_na_exists <- is.na(unlist(lapply(df[, col], function(x) my_match(x, lookup$old))))
assertthat::assert_that(!any(cond_na_exists))
df[, col] <- unlist(lapply(df[, col], function(x) lookup$new[my_match(x, lookup$old)]))
return(df)
}
df
是 data.frame,col
是列名向量,应使用 lookup
替换,data.frame 与列 "old" 和 "new".
如果您在基因列表中添加 listid
列
genelist1$listid = 1
genelist2$listid = 2
然后您可以将您的 df 与基因列表合并:
merge(df,rbind(genelist1,genelist2),all.x=T, by = "SYMBOL")
请注意,ERO1L 在你的 df 中是符号 6,在基因列表 1 中是 4,基因列表中缺少 HIF2A 和 REDD1,但 REDD1 在你的 df 中是符号 4(在 genlist1 中是 ERO1L ...所以我不是确定您在那种情况下期望的输出。
您也可以只合并基因名称:
merge(df,rbind(genelist1,genelist2),all.x=T, by.x = "Gene", by.y= "Gene")
您可以将所有的基因列表放在 list
:
gen_list <- list(genelist1 = genelist1,genelist2 = genelist2)
并将它们与您的目标进行比较 data.frame
:
cbind(df,do.call(cbind,lapply(seq_along(gen_list),function(x) ifelse( df$Gene %in% gen_list[[x]]$Gene,names(gen_list[x]),NA))))
为了完整性(以及大表的性能,也许),这是一个 data.table
方法:
library(data.table)
rbindlist(list(genelist1, genelist2), idcol = "glid")[, -"Gene"][
setDT(df), on = "SYMBOL"][, .(glid = toString(glid)), by = .(Gene, SYMBOL, Values)][]
Gene SYMBOL Values glid 1: TP53 2 3.55 2 2: XBP1 5 4.06 2 3: TP27 1 2.53 1, 2 4: REDD1 4 3.99 1 5: ERO1L 6 5.02 NA 6: STK11 9 3.64 2 7: HIF2A 8 2.96 NA
rbindlist()
从所有基因列表中创建一个 data.table
并添加一列 glid
以标识每一行的来源。 Gene
列被忽略,因为后续联接仅在 SYMBOL
上进行。在加入之前,df
使用 setDT()
被强制转换为 class data.table
。然后通过 SYMBOL
聚合合并的结果,以显示符号出现在两个基因列表中的情况,即 SYMBOL == 1
.
编辑
如果有很多基因列表或者需要基因列表的全名而不是数字,我们可以试试这个:
rbindlist(mget(ls(pattern = "^genelist")), idcol = "glid")[, -"Gene"][
setDT(df), on = "SYMBOL"][, .(glid = toString(glid)), by = .(Gene, SYMBOL, Values)][]
Gene SYMBOL Values glid 1: TP53 2 3.55 genelist2 2: XBP1 5 4.06 genelist2 3: TP27 1 2.53 genelist1, genelist2 4: REDD1 4 3.99 NA 5: ERO1L 6 5.02 genelist1 6: STK11 9 3.64 genelist2 7: HIF2A 8 2.96 NA
ls()
正在环境中查找名称以 genelist...
开头的对象。 mget()
returns 传递给 rbindlist()
.
数据
由 OP 提供
df <- structure(list(Gene = c("TP53", "XBP1", "TP27", "REDD1", "ERO1L",
"STK11", "HIF2A"), SYMBOL = c(2L, 5L, 1L, 4L, 6L, 9L, 8L), Values = c(3.55,
4.06, 2.53, 3.99, 5.02, 3.64, 2.96)), .Names = c("Gene", "SYMBOL",
"Values"), class = "data.frame", row.names = c(NA, -7L))
genelist1 <- structure(list(Gene = c("P4H", "PLK", "TP27", "KTD", "ERO1L"),
SYMBOL = c(10L, 7L, 1L, 11L, 4L)), .Names = c("Gene", "SYMBOL"
), class = "data.frame", row.names = c(NA, -5L))
genelist2 <- structure(list(Gene = c("TP53", "XBP1", "BHLHB", "STK11", "TP27",
"UPK"), SYMBOL = c(2L, 5L, 12L, 9L, 1L, 18L)), .Names = c("Gene",
"SYMBOL"), class = "data.frame", row.names = c(NA, -6L))