Create an ID (row number) column

RDataframeR Faq

R Problem Overview


I need to create a column with unique ID, basically add the row number as an own column. My current data frame looks like this:

   V1  V2
1  23  45
2  45  45
3  56  67

How to make it look like this:

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

?

Many thanks

R Solutions


Solution 1 - R

Two [tag:tidyverse] alternatives (using sgibb's example data):

tibble::rowid_to_column(d, "ID")

which gives:

> ID V1 V2 > 1 1 23 45 > 2 2 45 45 > 3 3 56 67

Or:

dplyr::mutate(d, ID = row_number())

which gives:

> V1 V2 ID > 1 23 45 1 > 2 45 45 2 > 3 56 67 3

As you can see, the rowid_to_column-function adds the new column in front of the other ones while the mutate&row_number()-combo adds the new column after the others.


And another base R alternative:

d$ID <- seq_along(d[,1])

Solution 2 - R

You could use 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: Here a comparison of @dacko suggestions. d$id <- seq_len(nrow(d) is slightly faster, but the order of the columns is different (id is the last column; reorder them seems to be slower than using 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

Solution 3 - R

You could also do this using dplyr:

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

Solution 4 - R

Many presented their ideas, but I think this is the sortest and simplest code for this task:

data$ID <- 1:nrow(data)

One line. The one and only.

Solution 5 - R

data.table solution

Easier syntax and much faster

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

Solution 6 - R

Hope this will help. Shortest and best way to create ID column is:

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

Solution 7 - R

Here is a solution that keeps the dplyr piping format and places id in the first column, which may be preferred.

d %>% 
  mutate(id = rownames(.)) %>% 
  select(id, everything())

Solution 8 - R

If you're starting without named rows in your df, the tidy way is:

df %>% 
  mutate(id = row_number()) %>% 
  select(id, everything())

Solution 9 - R

The function rownames_to_column() moves rownames into a column; found in the tidyverse package (docs).

rownames_to_column(DF, "my_column_name")

Use column_to_rownames() for the reverse operation.

Solution 10 - R

If your database is not too large this will work

# Load sample data
Dt1 <- tibble(V1=c(23,45,56),V2=c(45,45,67))
# Create Separate Tibble with row numbers
Dt2 <- tibble(id=seq(1:nrow(Dt1)))
# Join together
Dt3 <- cbind(Dt2,Dt1)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser10745View Question on Stackoverflow
Solution 1 - RJaapView Answer on Stackoverflow
Solution 2 - RsgibbView Answer on Stackoverflow
Solution 3 - RWhiskeyGolfView Answer on Stackoverflow
Solution 4 - REric LinoView Answer on Stackoverflow
Solution 5 - RaltabqView Answer on Stackoverflow
Solution 6 - RmehakVTView Answer on Stackoverflow
Solution 7 - RJopeView Answer on Stackoverflow
Solution 8 - RAndrew McCartneyView Answer on Stackoverflow
Solution 9 - RTobi ObeckView Answer on Stackoverflow
Solution 10 - RHarold HensonView Answer on Stackoverflow