提问人:user10745 提问时间:5/5/2013 最后编辑:Jaapuser10745 更新时间:5/5/2022 访问量:164496
创建 ID(行号)列
Create an ID (row number) column
问:
我需要创建一个具有唯一 ID 的列,基本上将行号添加为自己的列。我当前的数据框如下所示:
V1 V2
1 23 45
2 45 45
3 56 67
如何让它看起来像这样:
V1 V2 V3
1 23 45
2 45 45
3 56 67
?
非常感谢
答:
31赞
sgibb
5/5/2013
#1
您可以使用: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
评论
5赞
dickoa
5/5/2013
为什么不呢d$id <- seq_len(nrow(d))
colnames(d) <- paste0("V", 1:ncol(d))
1赞
sgibb
5/5/2013
@dickoa:我只是没有想到。请看我的编辑。您的解决方案速度稍快,但不保留列的顺序(但这在大多数情况下并不重要)。
25赞
WhiskeyGolf
10/24/2014
#2
您也可以使用以下命令执行此操作:dplyr
DF <- mutate(DF, id = rownames(DF))
评论
3赞
zx8754
10/11/2021
有一个很大的假设,即行名是数字。1:n
6赞
mehakVT
11/7/2017
#3
希望这会有所帮助。创建 ID 列的最短和最佳方法是:
dataframe$ID <- seq.int(nrow(dataframe))
11赞
altabq
11/15/2017
#4
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
69赞
Jaap
6/18/2018
#5
两个整洁的替代方案(使用 sgibb 的示例数据):
tibble::rowid_to_column(d, "ID")
这给了:
ID V1 V2 1 1 23 45 2 2 45 45 3 3 56 67
艺术
dplyr::mutate(d, ID = row_number())
这给了:
V1 V2 ID 1 23 45 1 2 45 45 2 3 56 67 3
如您所见,-function 将新列添加到其他列的前面,而 &-com 组合将新列添加到其他列之后。rowid_to_column
mutate
row_number()
另一个基本的 R 替代方案:
d$ID <- seq_along(d[,1])
评论
2赞
James Hirschorn
8/18/2018
奇怪的是,和 解决方案不适用于 。mutate
seq_along
data.table
1赞
Jaap
2/19/2020
@JamesHirschorn 除了 @altabq 所示的方法(这是 data.table 的首选方法)之外,您还可以执行 when is a .seq_along(d[[1]])
d
data.table
33赞
Eric Lino
8/9/2018
#6
许多人提出了他们的想法,但我认为这是这项任务最简单和最简单的代码:
data$ID <- 1:nrow(data)
一行。独一无二。
评论
2赞
Eric Lino
8/18/2018
没错,但是如果您的数据有 0 行,那么我想您根本没有数据。因此,为什么需要为其创建 ID?
4赞
James Hirschorn
8/18/2018
就我而言,它是在函数调用中作为参数传递的,并且事先不知道。一次可以有 10 行,下一次可以有 0 行。dataframe
1赞
amsloa
7/14/2019
这对我来说非常有效。首先使用 arrange(),然后应用 1:nrow() 创建一个顺序 ID 的新变量。谢谢你提供这个简单的解决方案。
0赞
PolII
8/10/2021
data <- cbind(data, 1:nrow(data))
然后是维基教科书的方式。names(data)[names(data)=="1:nrow(data)"] <- "ID"
4赞
Jope
4/14/2020
#7
这是一个解决方案,它保留了 dplyr 管道格式并将 id 放在第一列中,这可能是首选。
d %>%
mutate(id = rownames(.)) %>%
select(id, everything())
评论
3赞
hyman
3/9/2022
建议:代替select语句更简洁。relocate(id)
0赞
Jaap
9/25/2022
与这个答案相比,这有什么不同?
0赞
micstr
2/16/2023
现在有一个 in mutate 来控制新列的显示位置(而不是默认为最右边)。因此,您可以在 mutate 中执行:或者如果您不喜欢行名,请按照 Andrew McCartney 的解决方案使用。.before
d %>% mutate(id = rownames(.), .before=everything())
id = row_number()
5赞
Andrew McCartney
11/3/2020
#8
如果你开始的时候在df中没有命名的行,那么整洁的方法是:
df %>%
mutate(id = row_number()) %>%
select(id, everything())
评论
0赞
Jaap
9/25/2022
与这个答案相比,这有什么不同?
0赞
Tobi Obeck
2/24/2021
#9
该函数将行名移动到列中;在包 (docs) 中找到。rownames_to_column()
tidyverse
rownames_to_column(DF, "my_column_name")
用于反向操作。column_to_rownames()
0赞
Harold Henson
5/5/2022
#10
如果你的数据库不是太大,这将起作用
# 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)
评论