Bạn có thể sử dụng 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))
EDIT: Dưới đây là một so sánh các gợi ý @dacko. d$id <- seq_len(nrow(d)
là nhanh hơn một chút, nhưng thứ tự của các cột là khác nhau (id
là cột cuối cùng; sắp xếp lại chúng có vẻ là chậm hơn so với sử dụng 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
Tại sao không 'd $ id <- seq_len (nrow (d))' và sau đó 'colnames (d) <- paste0 (chữ "V", 1: ncol (d)) ' – dickoa
@dickoa: Tôi đã không nghĩ về nó. Vui lòng xem chỉnh sửa của tôi. Giải pháp của bạn nhanh hơn một chút nhưng không bảo vệ trật tự của các cột (nhưng điều này không quan trọng trong hầu hết các trường hợp). – sgibb