我在匹配R中数据框的列时遇到麻烦。我需要运行以下行:
rownames(clusterDF) <- rownames(OrderByCluster)
这两个df的行名都对应一个基因识别号。当我运行此行时,它将以与OrderByCluster中相同的顺序覆盖clusterDF的行名(它们的顺序不同)。
但是,另一列-群集号(例如1、2、3)不会随那些行名而相应地更改。也就是说,群集号与原始行名相关联,而不与新行名相关联。因此,没有将基因分配给正确的簇。
这是更改行名前后的clusterDF外观:
例如,基因20343本应位于群集1中,但是在更改行名之后将在群集2中,因为列没有相应更改。
对于上下文,我的OrderByCluster如下所示:
我试图查找要使用的函数,例如match函数,但我认为这不是我真正需要的?另一个想法是让clusterDF和OrderByCluster的行名具有相同的顺序(例如,升序或降序),但是我一直在查看的许多论坛帖子仅指定如何按列对dfs进行排序,而不是实际的行名。
编辑:抱歉,我对此很陌生,并且不知道dput。希望我已经做对了,但是我将clusterDF和OrderByCluster都分为了子集,这是dput的输出。
clusterDF_dput <- structure(c(2L, 2L, 1L, 2L, 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(clusterDF
和OrderByCluster
)的行名负责标识每一行中描述的基因。您正在尝试匹配两个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()
函数结合使用,将这些行名带入data.frame的列中,两者均来自dplyr
包。我在row_number()
函数之前使用过,但是我相信他会带来与您想要的输出不同的输出。
在下面的示例中,我将这些行名带入row_id
colunm,然后对负责join(left_join()
)的函数说,两个表中的键都在row_id
colunm中。所以left_join()
功能将首先匹配的值row_id
两个表中colunm,再一个,把所有的信息OrderByCluster
,到了clusterDF
,因此这些比赛。如果left_join()
函数在两个表之间的某行中找不到匹配项,则它将用NA(不可用)值填充该行。
这是将行名带到表的行的代码
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"
)
这是结果
head(clusterDF)
clusterDF_dput row_id CD23_WE1 CD23_WE2 CD23_Doc1 CD23_Doc2 EED_Doc1
1 2 20130 NA NA NA NA NA
2 2 76933 10.706632 10.604466 13.58021 13.35768 13.00360
3 1 231507 9.513296 8.989521 11.13337 11.10535 12.75215
4 2 20343 8.622914 8.453255 10.19068 10.55104 11.42488
5 2 203 NA NA NA NA NA
EED_Doc2
1 NA
2 12.86958
3 12.76417
4 11.53070
5 NA
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句