Создайте столбец идентификатора (номера строки)

Мне нужно создать столбец с уникальным идентификатором, в основном добавить номер строки как собственный столбец. Мой текущий фрейм данных выглядит так:

   V1  V2
1  23  45
2  45  45
3  56  67

Как это сделать так:

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

?

Большое спасибо


person user10745    schedule 05.05.2013    source источник


Ответы (9)


Вы можете использовать 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):

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
person sgibb    schedule 05.05.2013
comment
Почему не d$id <- seq_len(nrow(d)), а потом colnames(d) <- paste0("V", 1:ncol(d)) - person dickoa; 05.05.2013
comment
@dickoa: Я просто не подумал об этом. Пожалуйста, посмотрите мою правку. Ваше решение немного быстрее, но не сохраняет порядок столбцов (но в большинстве случаев это не важно). - person sgibb; 05.05.2013

Две альтернативы tidyverse (с использованием данных из примера sgibb):

tibble::rowid_to_column(d, "ID")

который дает:

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

Or:

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

который дает:

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

Как видите, rowid_to_column-функция добавляет новый столбец перед другими, в то время как _6 _ & _ 7_-combo добавляет новый столбец после других.


И еще одна альтернатива базового R:

d$ID <- seq_along(d[,1])
person Jaap    schedule 18.06.2018
comment
Любопытно, что решения mutate и seq_along не работают для data.table. - person James Hirschorn; 18.08.2018
comment
@JamesHirschorn Помимо метода, показанного @altabq (который является предпочтительным для data.table), вы могли делать seq_along(d[[1]]), когда d - это data.table. - person Jaap; 19.02.2020

Вы также можете сделать это с помощью dplyr:

DF <- mutate(DF, id = rownames(DF))
person WhiskeyGolf    schedule 23.10.2014

Многие представили свои идеи, но я думаю, что это самый удобный и простой код для этой задачи:

data$ID <- 1:nrow(data)

Одна линия. Единственный и неповторимый.

person Eric Lino    schedule 09.08.2018
comment
Верно, но если в ваших данных 0 строк, значит, данных у вас вообще нет. Следовательно, зачем вам создавать для него идентификатор? - person Eric Lino; 18.08.2018
comment
В моем случае это было внутри вызова функции, где dataframe передается в качестве аргумента и заранее не известен. Может быть 10 строк один раз, 0 следующий. - person James Hirschorn; 18.08.2018
comment
Это отлично сработало для меня. Сначала использовала функцию расположения (), а затем применила 1: nrow (), создав новую переменную последовательных идентификаторов. Спасибо за это простое решение. - person amsloa; 14.07.2019

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
person altabq    schedule 15.11.2017

Надеюсь, это поможет. Самый короткий и лучший способ создать столбец идентификатора:

dataframe$ID <- seq.int(nrow(dataframe))
person mehakVT    schedule 07.11.2017

Вот решение, которое сохраняет формат конвейера dplyr и помещает id в первый столбец, что может быть предпочтительнее.

d %>% 
  mutate(id = rownames(.)) %>% 
  select(id, everything())
person Jope    schedule 13.04.2020

Если вы начинаете без именованных строк в своем df, аккуратный способ:

df %>% 
  mutate(id = row_number()) %>% 
  select(id, everything())
person Andrew McCartney    schedule 03.11.2020

Функция rownames_to_column() перемещает имена строк в столбец; находится в пакете tidyverse (docs).

rownames_to_column(DF, "my_column_name")

Используйте column_to_rownames() для обратной операции.

person Tobi Obeck    schedule 23.02.2021