将列和行名称与另一个数据框中的列和值进行匹配

时间:2018-09-07 10:19:15

标签: r

我有两个数据帧,如下所示:

x<-data.frame("Trait1" =c(1,1,0,1),
          "Trait2"=c(1,NA,1,1),
          "Trait3" =c(0,1,0,1))
rownames(x)<-c("A","B","C","D") 

y <- matrix(c("A","A","B","C","D","C"), 
           nrow = 2, ncol = 3, byrow = TRUE, dimnames = list(c("individual1", "individual2"), 
                                                             c("Trait1","Trait2","Trait3")))

如此:

x

  Trait1 Trait2 Trait3
A      1      1      0
B      1     NA      1
C      0      1      0
D      1      1      1

y

         Trait1 Trait2 Trait3
individual1 "A"    "A"    "B"   
individual2 "C"    "D"    "C"  

我需要将x的行名与y中的值进行匹配,并且将两个数据框中的列名进行匹配,以获取每个人的值,如下所示:

         Trait1 Trait2 Trait3
individual1   1      1      1   
individual2   0      1      0  

任何建议将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:1)

使用tidyverse的一种可能的解决方案:只需使用有关每个治疗编号和治疗名称的信息来联接表,那么第一步就是将两个数据集转换(gather)成为治疗的通用形式number和处理都是列,而不是列名或行名。

library(dplyr)
library(tidyr)

x %>% mutate(v=rownames(.)) %>% 
  gather(k,w,-v) -> x1
y %>% as.data.frame(stringsAsFactors=FALSE) %>% mutate(ID=rownames(.)) %>%
  gather(k,v,-ID) %>% 
  inner_join(x1,by=c("k","v")) %>% 
  select(-v) %>% spread(k,w)

#           ID Trait1 Trait2 Trait3
#1 individual1      1      1      1
#2 individual2      0      1      0

答案 1 :(得分:1)

我真的不喜欢我的解决方案,我觉得应该有一个更好的方法来做到这一点,但就目前而言,它应该可以工作(虽然不是很好)。

代码如下:

t(sapply(1:nrow(y),function(i) sapply(1:ncol(y),function(j) x[match(y[i,],rownames(x)) 
[j],j])))

输出:

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    0    1    0

说明:

match(y[i,],rownames(x))

上面的代码将y的第i行的每一列与x的行名匹配。对于i = 1,结果为:

[1] 1 1 2

此向量中的每个元素都是我们将使用的x的行。现在我们只需要将其匹配到y的列(向量的顺序对应于y的列,即元素1对应于列1(trait1),元素2对应于列2(trait2))。 y的列如下:

对于i = 1

sapply(1:ncol(y),function(j) x[match(y[i,],rownames(x))[j],j])
#[1] 1 1 1

这是新矩阵的第一行,现在我们将其应用于y的每一行以获取新矩阵的其他行:

t(sapply(1:nrow(y),function(i) sapply(1:ncol(y),function(j)                                                                
    x[match(y[i,],rownames(x))[j],j])))

*请注意,由于sapply会按列返回它,因此我进行了转置。

无论如何,您都可以将新矩阵命名为与y相同,但是对于我认为应该更简单的东西来说,解决方案有点复杂,因此请检查是否可以改进代码。如果可以更好地使用以下语句,则也许不需要sapply:

i=1
match(y[i,],rownames(x))

答案 2 :(得分:0)

这是一个提案:

#make table of row coordinates
coordinaterow<-y

#make table of col coordinates
coordinatecol<-matrix(colnames(y), 
                      nrow=nrow(y), 
                      ncol=ncol(y), 
                      byrow=TRUE)

#Use coordinates in mapply function to produce the final table.
finalresult<-y  

finalresult[]<-mapply(function(r,c)
  x[r,c],
  coordinaterow,
  coordinatecol,
  SIMPLIFY = TRUE)