我正在处理微阵列数据。
我有两个表,一个是通路和基因集表(我将其称为A表) 另一个是微阵列表(让我们说B)
我需要根据B中基因符号的每个表达值将基因符号(字符)改为A表中的表达值(数字)
表格如下所示
A table B table
Pathway v1 v2 ...v249 v250 Gene Value
1 A E NA NA E 1000
2 B A Z I A 500
3 C G X NA G 200
4 D K P NA B 300
P 10
Z 20
我想像下面的方式更改一个表
A table
Pathway v1 v2 ... v249 v250
1 500 1000 NA NA
2 300 500 20 NA
3 NA 200 NA NA
4 NA NA 10 NA
如果没有匹配的基因符号,则应将其替换为“NA”
答案 0 :(得分:3)
我会建议,首先融化,然后合并,然后回归。这适用于created_time
数据集中的任意数量的列。我将在CRAN上使用最新的A
版本(v 1.9.6 +)
data.table
或类似地使用Hadleyverse
library(data.table) # V 1.9.6+
res <- melt(setDT(A), id = "Pathway")[setDT(B), Value := i.Value, on = c(value = "Gene")]
dcast(res, Pathway ~ variable, value.var = "Value")
# Pathway v1 v2
# 1: 1 500 1000
# 2: 2 300 500
# 3: 3 NA 200
# 4: 4 NA NA
数据强>
library(dplyr)
library(tidyr)
A %>%
gather(res, Gene, -Pathway) %>%
left_join(., B, by = "Gene") %>%
select(-Gene) %>%
spread(res, Value)
# Pathway v1 v2
# 1 1 500 1000
# 2 2 300 500
# 3 3 NA 200
# 4 4 NA NA
答案 1 :(得分:3)
我们也可以使用base R
执行此操作。我们将'A'的子集(即除了'Pathway'列)转换为matrix
,将match
转换为'B'中的'Gene',获得的数字索引可用于填充相应的' “值”列,然后重新分配输出。
A1 <- A
A1[-1] <- B$Value[match(as.matrix(A[-1]), B$Gene)]
A1
# Pathway v1 v2
#1 1 500 1000
#2 2 300 500
#3 3 NA 200
#4 4 NA NA
注意:来自@DavidArenburg的帖子的数据集。
答案 2 :(得分:2)
这可以使用查找表最容易地完成,查找表本质上是一个在R中具有关联名称的向量:
library(dplyr)
df = data.frame(v1 = sample(LETTERS[1:8], 100, replace = TRUE),
v2 = sample(LETTERS[1:8], 100, replace = TRUE),
v3 = sample(LETTERS[1:8], 100, replace = TRUE),
v4 = sample(LETTERS[1:8], 100, replace = TRUE))
lut = runif(6)
names(lut) = LETTERS[1:6]
replace_fun = function(vec) lut[vec]
df %>% mutate_each(funs(replace_fun), v1:v4)
a b
1 0.97821935 0.8584000
2 NA NA
3 0.56299342 0.9782194
4 0.85840001 0.8584000
5 0.97821935 0.8584000
6 0.06881867 0.9782194
基本上,每个元素的名称是df
中的字母,lut[letter]
查找哪个值属于该字母。通过使用lut[vec]
,我们将包含字母的整个向量放入查找表中,该表将整个向量转换为相应的数字。
%>%
和mutate_each
是来自dplyr
的函数,我用它来实际执行示例数据的替换。