创建ID(行号)列

use*_*745 24 r dataframe r-faq

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

   V1  V2
1  23  45
2  45  45
3  56  67
Run Code Online (Sandbox Code Playgroud)

如何让它看起来像这样:

V1  V2  V3
1  23  45
2  45  45
3  56  67
Run Code Online (Sandbox Code Playgroud)

?非常感谢

sgi*_*ibb 20

你可以使用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))
Run Code Online (Sandbox Code Playgroud)

编辑:这里是@dacko建议的比较.d$id <- seq_len(nrow(d)稍快,但列的顺序是不同的(id是最后一列;重新排序它们似乎比使用慢cbind):

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
Run Code Online (Sandbox Code Playgroud)

  • 为什么不``$ id < - seq_len(nrow(d))`然后`colnames(d)< - paste0("V",1:ncol(d)) (4认同)

小智 20

你也可以这样做dplyr:

DF <- mutate(DF, id = rownames(DF))
Run Code Online (Sandbox Code Playgroud)

  • 有一个**大**假设行名是数字“1:n”。 (3认同)

Jaa*_*aap 14

两个替代方案(使用sgibb的示例数据):

tibble::rowid_to_column(d, "ID")
Run Code Online (Sandbox Code Playgroud)

这使:

  ID V1 V2
1  1 23 45
2  2 45 45
3  3 56 67
Run Code Online (Sandbox Code Playgroud)

要么:

dplyr::mutate(d, ID = row_number())
Run Code Online (Sandbox Code Playgroud)

这使:

  V1 V2 ID
1 23 45  1
2 45 45  2
3 56 67  3
Run Code Online (Sandbox Code Playgroud)

如您所见,-function将新列添加到rowid_to_column其他列之前,而mutate&row_number()-combo将新列添加到其他列之后.


另一个基础R替代方案:

d$ID <- seq_along(d[,1])
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,“mutate”和“seq_along”解决方案不适用于“data.table”。 (2认同)

alt*_*abq 6

数据表解决方案

语法更简单,速度更快

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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

dataframe$ID <- seq.int(nrow(dataframe))
Run Code Online (Sandbox Code Playgroud)


Eri*_*ino 5

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

data$ID <- 1:nrow(data)
Run Code Online (Sandbox Code Playgroud)

一条线。唯一的。

  • 确实如此,但如果你的数据有 0 行,那么我猜你根本就没有数据。那么,为什么需要为其创建一个 ID? (2认同)
  • 就我而言,它位于函数调用内部,其中dataframe作为参数传递,并且事先未知。一次可以有10行,下次可以有0行。 (2认同)

And*_*ney 5

如果您开始时 df 中没有命名行,那么简洁的方法是:

df %>% 
  mutate(id = row_number()) %>% 
  select(id, everything())
Run Code Online (Sandbox Code Playgroud)