2013-05-05 26 views
10

我需要創建具有唯一ID的列。我現在的數據幀是這樣的: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 

?非常感謝

回答

15

你可以使用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)稍微快一點,但列的順序是不同的(id是最後一列,對它們重新排序似乎比使用cbind慢):使用dplyr

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

爲什麼不'd $ ID < - seq_len(nrow(d))'然後'colnames(d)< - paste0( 「V」, 1:ncol(d))' – dickoa 2013-05-05 13:30:35

+1

@dickoa:我只是沒有想到它。請參閱我的編輯。您的解決方案速度稍快,但不保留列的順序(但在大多數情況下,這並不重要)。 – sgibb 2013-05-05 15:34:38

10

你也可以這樣做:

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

希望這將幫助 - 最短,最好的方法來創建ID列是 -

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

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