R中两个DF的匹配/对齐列

问题描述

我在匹配R中数据框的列时遇到麻烦。我需要运行以下行:

rownames(clusterDF) <- rownames(OrderByCluster)

这两个df的行名都对应一个基因识别号。当我运行此行时,它将以与OrderByCluster中相同的顺序覆盖clusterDF的行名(它们的顺序不同)。

但是,另一列-群集号(例如1、2、3)不会与这些行名相应地更改。也就是说,群集号与原始行名相关联,而不与新行名相关联。因此,这些基因没有分配给正确的簇。

这是在更改行名之前和之后clusterDF的外观:

例如基因20343本应位于群集1中,但是更改行名之后将位于群集2中,因为该列没有相应更改。

enter image description here

enter image description here

对于上下文,我的OrderByCluster如下所示:

enter image description here

我尝试查找要使用的功能,例如匹配功能,但我认为这不是我所需要的吗?另一个想法是让clusterDF和OrderByCluster的行名具有相同的顺序(例如,升序或降序),但是我一直在查看的许多论坛帖子仅指定如何按列对dfs进行排序,而不是实际的行名。 / p>

编辑:对不起,我对此很陌生,并且不了解dput。希望我已经做对了,但是我已经将clusterDF和OrderByCluster子集了,这是dput的输出

clusterDF_dput <- structure(c(2L,2L,1L,2L),.Label = c("1","2","3"),class = "factor")

OrderByCluster_dput <- structure(c(9.51329554103103,9.14277232387578,12.2714405068735,10.706631872116,8.62291428297462,8.98952149388347,8.52097250675874,12.3272001162907,10.6044657262387,8.45325504643134,11.1333650918029,10.8998190141107,14.3764779789928,13.5802066640389,10.1906849771101,11.1053464801885,11.2180047488173,13.7233369788605,13.3576808929928,10.5510358229245,12.7521453126162,12.1288209268913,15.1014057359463,13.0035983162112,11.4248804834167,12.7641683968991,12.1443475666368,15.4920056830767,12.8695811644779,11.5307043114641),.Dim = 5:6,.Dimnames = list(
    c("231507","100041546","110257","76933","20343"),c("CD23_WE1","CD23_WE2","CD23_Doc1","CD23_Doc2","EED_Doc1","EED_Doc2"
    )))

解决方法

我了解以下内容:两个data.frames(clusterDFOrderByCluster)的行名负责识别每一行中描述的基因。您正在尝试匹配两个data.frames的行名,以便可以将OrderByCluster表中的信息正确连接到clusterDF中描述的每个基因。

如果您尝试执行此操作,则实际上可以通过联接操作将OrderByCluster表中的所有信息(所有列)带到clusterDF DF。连接操作将选择一个在两个表中都可用的键,并将匹配这些键。当联接计算出所有匹配项时,他将根据这些键的这些匹配项从字面上联接或混合两个表。

根据您提供的数据,OrderByCluster是一个数字矩阵,而clusterDF只是一个包含因子值的向量。为了使我的代码对您有用,您必须将这些对象转换为表(data.frame)。下面的代码执行此转换。除此之外,我假设您的clusterDF具有标识基因的行名,但是您的clusterDF输出产生的dput()没有这些行名,因此我生成了一组随机行名,只是为了使方法更清晰。请注意,在这组行名中,OrderByCluster中定义了三个基因,因此我们最终希望联接将带来OrderByCluster中这三个基因的信息。

OrderByCluster <- as.data.frame(OrderByCluster_dput)
clusterDF <- as.data.frame(clusterDF_dput)
row.names(clusterDF) <- c("20130","76933","231507","20343","203")

因此,由于您的键或换句话说,标识基因的值位于表的行名中,因此您需要将这些行名带到表的行中,因为作为行名,它们只是一个属性您的对象。您可以通过row.names()包中的mutate()函数和dplyr函数将这些行名带入data.frame的行中。我在row_number()函数之前使用过,但是我相信他会带来与您想要的输出不同的输出。

在下面的示例中,我将这些行名带到row_id列,然后对负责联接(left_join())的函数说两个表中的键都在{{ 1}} colunm。因此,row_id函数将首先匹配两个表中left_join()列中的值,然后将row_id中的所有信息带到OrderByCluster中,以符合这些匹配条件。如果clusterDF函数在两个表之间的某行中找不到匹配项,则它将用NA(不可用)值填充该行。

以下是将行名带到表的行中的代码

left_join()

这是进行联接操作的代码

library(dplyr)

clusterDF <- mutate(
  clusterDF,row_id = row.names(clusterDF)
)

OrderByCluster <- mutate(
  OrderByCluster,row_id = row.names(OrderByCluster)
)

这是结果

clusterDF <- left_join(
  clusterDF,OrderByCluster,by = "row_id"
)