如何使用if和for语句将值从字符更改为数字?

时间:2015-10-19 11:01:32

标签: r

我正在处理微阵列数据。

我有两个表,一个是通路和基因集表(我将其称为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”

3 个答案:

答案 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的函数,我用它来实际执行示例数据的替换。