2013-05-05 27 views
10

Tôi cần tạo cột có ID duy nhất. khung dữ liệu hiện tại của tôi trông như thế này:Thông tin cơ bản về R: tạo cột ID

V1 V2 
1 23 45 
2 45 45 
3 56 67 

Làm thế nào để làm cho nó trông như thế này:

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

? Rất cám ơn

Trả lời

15

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 
+4

Tại sao không 'd $ id <- seq_len (nrow (d))' và sau đó 'colnames (d) <- paste0 (chữ "V", 1: ncol (d)) ' – dickoa

+1

@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

10

Bạn cũng có thể làm điều này bằng dplyr:

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

Hy vọng điều này sẽ help-- Shortest và cách tốt nhất để tạo ra cột ID là-

 dataframe$ID <- seq.int(nrow(dataframe)) 
0

giải pháp data.table

dễ dàng hơn cú pháp và nhanh hơn nhiều

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 
Các vấn đề liên quan