我需要创建一个具有唯一ID的列,基本上将行号添加为自己的列。我目前的数据框如下所示:
V1 V2
1 23 45
2 45 45
3 56 67
如何使它看起来像这样:
V1 V2 V3
1 23 45
2 45 45
3 56 67
?非常感谢
答案 0 :(得分:20)
您也可以使用dplyr
:
DF <- mutate(DF, id = rownames(DF))
答案 1 :(得分:19)
您可以使用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
答案 2 :(得分:10)
两个tidyverse替代品(使用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
正如您所看到的,rowid_to_column
- 函数会将新列添加到其他列之前,而mutate
&amp; row_number()
- 组合会将新列添加到其他列之后。
另一个基础R替代方案:
d$ID <- seq_along(d[,1])
答案 3 :(得分:6)
语法更简单,速度更快
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
答案 4 :(得分:3)
希望这会有所帮助。创建ID列的最短和最佳方法是:
dataframe$ID <- seq.int(nrow(dataframe))
答案 5 :(得分:3)
这是一个保留dplyr管道格式并将id放在第一列的解决方案,这可能是首选。
d %>%
mutate(id = rownames(.)) %>%
select(id, everything())
答案 6 :(得分:1)
许多人提出了他们的想法,但我认为这是完成此任务的最简单的代码:
data$ID <- 1:nrow(data)
一行。唯一的。
答案 7 :(得分:0)
如果您在df中开始时没有命名行,那么整洁的方法是:
df %>%
mutate(id = row_number()) %>%
select(id, everything())
答案 8 :(得分:0)
函数 QMessageBox::information(this, "some title", "my text");
将行名移动到列中;在 rownames_to_column()
包 (docs) 中找到。
tidyverse
使用 rownames_to_column(DF, "my_column_name")
进行反向操作。