创建 ID(行号)列

Create an ID (row number) column

提问人:user10745 提问时间:5/5/2013 最后编辑:Jaapuser10745 更新时间:5/5/2022 访问量:164496

问:

我需要创建一个具有唯一 ID 的列,基本上将行号添加为自己的列。我当前的数据框如下所示:

   V1  V2
1  23  45
2  45  45
3  56  67

如何让它看起来像这样:

V1  V2  V3
1  23  45
2  45  45
3  56  67

?

非常感谢

DataFrame R-FAQ Tidyverse

评论


答:

31赞 sgibb 5/5/2013 #1

您可以使用:cbind

d <- data.frame(V1=c(23, 45, 56), V2=c(45, 45, 67))

## enter id here, you could also use 1:nrow(d) instead of rownames
id <- rownames(d)
d <- cbind(id=id, d)

## set colnames to OP's wishes
colnames(d) <- paste0("V", 1:ncol(d))

编辑:以下是@dacko建议的比较。 稍微快一点,但列的顺序不同(是最后一列;重新排序它们似乎比使用 ):d$id <- seq_len(nrow(d)idcbind

library("microbenchmark")

set.seed(1)
d <- data.frame(V1=rnorm(1e6), V2=rnorm(1e6))

cbindSeqLen <- function(x) {
  return(cbind(id=seq_len(nrow(x)), x))
}

dickoa <- function(x) {
  x$id <- seq_len(nrow(x))
  return(x)
}

dickoaReorder <- function(x) {
  x$id <- seq_len(nrow(x))
  nc <- ncol(x)
  x <- x[, c(nc, 1:(nc-1))]
  return(x)
}

microbenchmark(cbindSeqLen(d), dickoa(d), dickoaReorder(d), times=100)

# Unit: milliseconds
#             expr      min       lq   median       uq      max neval
#   cbindSeqLen(d) 23.00683 38.54196 40.24093 42.60020 47.73816   100
#        dickoa(d) 10.70718 36.12495 37.58526 40.22163 72.92796   100
# dickoaReorder(d) 19.25399 68.46162 72.45006 76.51468 88.99620   100

评论

5赞 dickoa 5/5/2013
为什么不呢d$id <- seq_len(nrow(d))colnames(d) <- paste0("V", 1:ncol(d))
1赞 sgibb 5/5/2013
@dickoa:我只是没有想到。请看我的编辑。您的解决方案速度稍快,但不保留列的顺序(但这在大多数情况下并不重要)。
25赞 WhiskeyGolf 10/24/2014 #2

您也可以使用以下命令执行此操作:dplyr

DF <- mutate(DF, id = rownames(DF))

评论

3赞 zx8754 10/11/2021
有一个很大的假设,即行名是数字。1:n
6赞 mehakVT 11/7/2017 #3

希望这会有所帮助。创建 ID 列的最短和最佳方法是:

dataframe$ID <- seq.int(nrow(dataframe))
11赞 altabq 11/15/2017 #4

data.table 解决方案

语法更简单,速度更快

library(data.table)

dt <- data.table(V1=c(23, 45, 56), V2=c(45, 45, 67))

setnames(dt, c("V2", "V3")) # changing column names
dt[, V1 := .I] # Adding ID column
69赞 Jaap 6/18/2018 #5

两个(使用 sgibb 的示例数据):

tibble::rowid_to_column(d, "ID")

这给了:

  ID V1 V2
1  1 23 45
2  2 45 45
3  3 56 67

艺术

dplyr::mutate(d, ID = row_number())

这给了:

  V1 V2 ID
1 23 45  1
2 45 45  2
3 56 67  3

如您所见,-function 将新列添加到其他列的前面,而 &-com 组合将新列添加到其他列之后。rowid_to_columnmutaterow_number()


另一个基本的 R 替代方案:

d$ID <- seq_along(d[,1])

评论

2赞 James Hirschorn 8/18/2018
奇怪的是,和 解决方案不适用于 。mutateseq_alongdata.table
1赞 Jaap 2/19/2020
@JamesHirschorn 除了 @altabq 所示的方法(这是 data.table 的首选方法)之外,您还可以执行 when is a .seq_along(d[[1]])ddata.table
33赞 Eric Lino 8/9/2018 #6

许多人提出了他们的想法,但我认为这是这项任务最简单和最简单的代码:

data$ID <- 1:nrow(data)

一行。独一无二。

评论

2赞 Eric Lino 8/18/2018
没错,但是如果您的数据有 0 行,那么我想您根本没有数据。因此,为什么需要为其创建 ID?
4赞 James Hirschorn 8/18/2018
就我而言,它是在函数调用中作为参数传递的,并且事先不知道。一次可以有 10 行,下一次可以有 0 行。dataframe
1赞 amsloa 7/14/2019
这对我来说非常有效。首先使用 arrange(),然后应用 1:nrow() 创建一个顺序 ID 的新变量。谢谢你提供这个简单的解决方案。
0赞 PolII 8/10/2021
data <- cbind(data, 1:nrow(data))然后是维基教科书的方式。names(data)[names(data)=="1:nrow(data)"] <- "ID"
4赞 Jope 4/14/2020 #7

这是一个解决方案,它保留了 dplyr 管道格式并将 id 放在第一列中,这可能是首选。

d %>% 
  mutate(id = rownames(.)) %>% 
  select(id, everything())

评论

3赞 hyman 3/9/2022
建议:代替select语句更简洁。relocate(id)
0赞 Jaap 9/25/2022
这个答案相比,这有什么不同?
0赞 micstr 2/16/2023
现在有一个 in mutate 来控制新列的显示位置(而不是默认为最右边)。因此,您可以在 mutate 中执行:或者如果您不喜欢行名,请按照 Andrew McCartney 的解决方案使用。.befored %>% mutate(id = rownames(.), .before=everything()) id = row_number()
5赞 Andrew McCartney 11/3/2020 #8

如果你开始的时候在df中没有命名的行,那么整洁的方法是:

df %>% 
  mutate(id = row_number()) %>% 
  select(id, everything())

评论

0赞 Jaap 9/25/2022
这个答案相比,这有什么不同?
0赞 Tobi Obeck 2/24/2021 #9

该函数将行名移动到列中;在包 (docs) 中找到。rownames_to_column()tidyverse

rownames_to_column(DF, "my_column_name")

用于反向操作。column_to_rownames()

0赞 Harold Henson 5/5/2022 #10

如果你的数据库不是太大,这将起作用

# Load sample data
Dt1 <- tibble(V1=c(23,45,56),V2=c(45,45,67))
# Create Separate Tibble with row numbers
Dt2 <- tibble(id=seq(1:nrow(Dt1)))
# Join together
Dt3 <- cbind(Dt2,Dt1)