r比较两个对象并用相应的行号替换名称

时间:2015-06-17 12:12:04

标签: r

我正在寻找可用于解决问题的功能。 我有:

nazwy - 带有样本名称的矩阵(1行和n列)(作为参考矩阵)

标签 - data.frame。 例如:

Nazwy:
1   At5g
2   At5a
3   A63h
4   Aj89
5   Ae31

Tab:
1   At5g    Ae31
2   Aj89    At5g
3   At5a    0
4   0       0

在'Tab'中我想用'Nazwy'中的相应行号替换名称。

Result:
1   1   5
2   4   1
3   2   0
4   0   0

我使用带有substring()函数的循环,但对于非常大的数据计算持续很长时间,所以我正在寻找另一种解决方案。 你有什么想法吗?

gosia

1 个答案:

答案 0 :(得分:2)

您可以使用match

 res <- Tab
 res[] <- match(as.matrix(Tab), Nazwy[,1], nomatch=0)
 res
 #  v1 v2
 #1  1  5
 #2  4  1
 #3  2  0
 #4  0  0

或者

 library(data.table)
 res <- copy(Tab)

 for(j in seq_along(res)){
  set(res, i=NULL, j=j, value=match(res[[j]], Nazwy[,1], nomatch=0))
  }
 res
#   v1 v2
#1:  1  5
#2:  4  1
#3:  2  0
#4:  0  0

或者

library(dplyr)
mutate_each(Tab,funs(match(., Nazwy[,1], nomatch=0)))
#  v1 v2
#1  1  5
#2  4  1
#3  2  0
#4  0  0

数据

 Nazwy <- structure(c("At5g", "At5a", "A63h", "Aj89", "Ae31"), 
 .Dim = c(5L, 
 1L), .Dimnames = list(c("1", "2", "3", "4", "5"), "v1"))

 Tab <- structure(list(v1 = c("At5g", "Aj89", "At5a", "0"),
 v2 = c("Ae31", 
 "At5g", "0", "0")), .Names = c("v1", "v2"), class = "data.frame", 
 row.names = c("1", "2", "3", "4"))