将第一列设置为行名,尽管有重复

Set first column as rowname, in spite of duplicates

 sample
      Symobls  IDs Value1 Value2 Value3
 1     NA      NA   3.1    2.3    1.7
 2     TP53   1234  5.8    6.9    10.1
 3     Kras   5678  0.1    0.3    0.5
 4     NA      NA   10.3   2.1    7.9
 5     Hras   9991  20.0   30.0   40.0
 6     TP53   1234  -3.1   0.2    1.7

我的 table 看起来像这个。 我需要按行或列计算值。 所以,我尝试使用符号作为新的行名。这样,我可以使用 sample["Hras"] 计算整行值 尝试这样做时,我遇到了这个问题。

rownames(sample)<-sample[,1]

Error in row.names<-.data.frame(*tmp*, value = value) : duplicate 'row.names' are not allowed In addition: Warning message: non-unique values when setting 'row.names': ‘A1CF’, ‘A2M’, ‘A2ML1’, ‘AAGAB’, ‘AAK1’, ‘AAMDC’, ‘AARS2’, ‘AASDH’, ‘AASDHPPT’, ‘AASS’, ‘ABAT’, ‘ABCA1’, ‘ABCA13’, ‘ABCA2’, ‘ABCA4’, ‘ABCA5’, ‘ABCA8’, ‘ABCA9’, ‘ABCB1’, ‘ABCB11’, ‘ABCB4’, ‘ABCB5’, ‘ABCB6’, ‘ABCB8’, ‘ABCB9’, ‘ABCC1’, ‘ABCC10’, ‘ABCC11’, ‘ABCC12’, ‘ABCC13’, ‘ABCC3’, ‘ABCC4’, ‘ABCC5’, ‘ABCC6’, ‘ABCC8’, ‘ABCC9’, ‘ABCD3’, ‘ABCD4’, ‘ABCE1’, ‘ABCF2’, ‘ABCG1’, ‘ABHD1’, ‘ABHD10’, ‘ABHD11’, ‘ABHD12’, ‘ABHD13’, ‘ABHD17B’, ‘ABHD2’, ‘ABHD5’, ‘ABHD6’, ‘ABI1’, ‘ABI2’, ‘ABI3BP’, ‘ABL2’, ‘ABLIM1’, ‘ABLIM2’, ‘ABO’, ‘ABR’, ‘ABRA’, ‘ABTB1’, ‘ABTB2’, ‘ACAA1’, ‘ACAA2’, ‘ACACA’, ‘ACACB’, ‘ACAD10’, ‘ACADL’, ‘ACADSB’, ‘ACAN’, ‘ACAP1’, ‘ACAP2’, ‘ACAP3’, ‘ACAT1’, �� [... truncated]

这是因为"NA"吗?其他选择? 谢谢

这是一个微阵列数据集。我已经完成标准化并打算提取几个基因的值来执行绘图、互相关和 t 检验。事实上,不仅 NA,而且我将用于绘制图形的几个基因都有多行。所以,我需要将它们提取到另一个 table 中以备后用。

在这里,我只是回答您在问题中要求的一种更改row.names的方法。最终目标不明确。对于指定的问题,您可以尝试使用 make.names 和选项 unique=TRUE。这将确保重复的名称不同。在第一列中,有 NA 个值,它们将被命名为 NA.NA..1 等。(如果您愿意的话)。

 row.names(sample) <- make.names(sample[,1],TRUE)

或如@Richard Scriven 所评论,

row.names(sample) <- paste(make.unique(df[,1]))

另一种选择是将 data.frame 转换为 matrix(这将允许重复值)。仅当 columns 与 class 相同时,我才推荐这样做。例如,如果您有 characternumeric 列,这会将所有列转换为 character class。在您的数据集中,在我看来,除了第一列外,所有其他列都是数字( "IDs" 列可能除外)。但是 NA 值又是一个问题。如果您想根据行名对“第一”或“第三”行进行子集化,这将很困难。

sample1 <- as.matrix(sample[,-1])
row.names(sample1) <- sample[,1]
sample1['Hras',]
#  IDs Value1 Value2 Value3 
#  9991     20     30     40