# R - 创建一个 ID(行号)列

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

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

?

## 推荐答案

``````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))
``````

EDIT:这里是@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
``````