将行名转换为第一列

Posted

技术标签:

【中文标题】将行名转换为第一列【英文标题】:Convert row names into first column 【发布时间】:2015-06-13 05:00:04 【问题描述】:

我有一个这样的数据框:

df
              VALUE              ABS_CALL DETECTION P-VALUE    
    1007_s_at "957.729231881542" "P"      "0.00486279317241156"
    1053_at   "320.632701283368" "P"      "0.0313356324173416" 
    117_at    "429.842323161046" "P"      "0.0170004527476119" 
    121_at    "2395.7364289242"  "P"      "0.0114473584876183" 
    1255_g_at "116.493632746934" "A"      "0.39799368200131"   
    1294_at   "739.927122116896" "A"      "0.0668649772942343" 

我想。目前我使用这样的东西将行名作为第一列:

  d <- df
  names <- rownames(d)
  rownames(d) <- NULL
  data <- cbind(names,d)

是否有一行可以做到这一点?

【问题讨论】:

R: converting row names in multiple data frames to column in data frame 的可能重复项 你不需要额外的包,这里有一个单行:d &lt;- cbind(rownames(d), data.frame(d, row.names=NULL)) @ssp3nc3r 的评论应该是可接受的答案 【参考方案1】:

或者您可以使用tibblerownames_to_column,它的作用与大卫的回答相同:

library(tibble)
df <- tibble::rownames_to_column(df, "VALUE")

注意:早期的函数add_rownames() 已被弃用,并被tibble::rownames_to_column() 取代

【讨论】:

完全相同,因为它不是通过引用 :) 更新:dplyr 更新需要使用 tibble::rownames_to_column() 因为 dplyr::rownames 已被弃用。 如果你想留在 tidyverse 中,这很好【参考方案2】:

您可以使用setDT 及其keep.rownames = TRUE 参数 删除行名并将它们通过引用 转换为列(无需使用-&gt; 重新分配内存)来自data.table

library(data.table)
setDT(df, keep.rownames = TRUE)[]
#    rn     VALUE  ABS_CALL DETECTION     P.VALUE
# 1:  1 1007_s_at  957.7292         P 0.004862793
# 2:  2   1053_at  320.6327         P 0.031335632
# 3:  3    117_at  429.8423         P 0.017000453
# 4:  4    121_at 2395.7364         P 0.011447358
# 5:  5 1255_g_at  116.4936         A 0.397993682
# 6:  6   1294_at  739.9271         A 0.066864977

正如@snoram 所述,您可以为新列指定任何您想要的名称,例如setDT(df, keep.rownames = "newname") 将添加“newname”作为行列。

【讨论】:

如果需要,使用colnames(df)[1] &lt;- "newname" 重命名第一列。 @Swetabh 好吧,不。 setnames(df, 1, "newname")data.table 方式。 @DavidArenburg 好吧,(至少)现在你可以在同一个电话中做到这一点setDT(df, keep.rownames = "newname")[] @DavidArenburg 在as.data.table() 的文档中找到:如果为 TRUE,则将输入对象的名称添加为名为“rn”的单独列。 keep.rownames = "id" 将列命名为 "id" @snoram 很好的发现,我会就此进行 PR 以使文档保持一致。【参考方案3】:

单行选项是:

df$names <- rownames(df)

【讨论】:

我希望您知道它在最后添加了rownames 作为一列,实际上不是作为第一列。 删除索引后使用rownames(df) &lt;- NULL【参考方案4】:

或者,您可以创建一个新的数据框(或覆盖当前的数据框,如下例所示),这样您就不需要使用任何外部包。但是,这种方式对于大型数据帧可能效率不高。

df <- data.frame(names = row.names(df), df)

【讨论】:

或:df &lt;- cbind(names = rownames(df), df)【参考方案5】:

根据上述建议将我的评论移至答案中:

你不需要额外的包,这里有一个单行:

d <- cbind(rownames(d), data.frame(d, row.names=NULL))

【讨论】:

【参考方案6】:

dplyr::as_tibble(df, rownames = "your_row_name") 会给你更简单的结果。

【讨论】:

@HectorHaffenden 为海报编辑了这个,因为它实际上是一个很好的建议。 "as_data_frame() 在 tibble 2.0.0 中已弃用。请改用as_tibble()。"否则这是我的最爱。【参考方案7】:

或者使用DBIs sqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)

【讨论】:

【参考方案8】:
df = data.frame(columnNameILike = row.names(df), df)

【讨论】:

【参考方案9】:

将数据行名更改为真实列

data <- data %>%
  rownames_to_column(var="the name you want")

【讨论】:

以上是关于将行名转换为第一列的主要内容,如果未能解决你的问题,请参考以下文章

使用 write.csv 时防止将行名写入文件

使用R将行转换为列,将列转换为行

将行值转换为列,其值来自 spark scala 中的另一列 [重复]

R语言中怎么把第一列的数据作为行名

将行名添加到 cde 表组件

Redshift SQL - 将行按 id 转换为列