我有一个data.frame,其布局如下:
Data = Id somevalue
1 ab
1 cd
1 i
2 o
2 j
我希望通过Id获取索引,以便我得到以下内容:
Data = Id somevalue index
1 ab 1
1 cd 2
1 i 3
2 o 1
2 j 2
我现在的方式是
for(ID in search_IDs)
{
Data[Data[,1]==ID,]$index<-1:length(Data[DataGuess[,1]==ID,1])
}
或更喜欢:
Data<-as.data.frame(sapply(Ids,FUN=(function(x,y)y[y[,1]==x,]$index<-1:length(y[y[,1]==x,1])),y=Data))
然而,两者都需要很长时间才能完成,我想知道是否有更快的方法来完成这项工作。
答案 0 :(得分:1)
基地R:
x1 <- do.call(
rbind.data.frame,
by(x, x$Id, function(df) { df$index <- seq_len(nrow(df)); df; })
)
x1
# Id somevalue index
# 1.1 1 ab 1
# 1.2 1 cd 2
# 1.3 1 i 3
# 2.4 2 o 1
# 2.5 2 j 2
使用dplyr
:
library(dplyr)
x2 <- x %>%
group_by(Id) %>%
mutate(index = row_number()) %>%
ungroup()
x2
# # A tibble: 5 x 3
# Id somevalue index
# <int> <chr> <int>
# 1 1 ab 1
# 2 1 cd 2
# 3 1 i 3
# 4 2 o 1
# 5 2 j 2
您的数据:
x <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
Id somevalue
1 ab
1 cd
1 i
2 o
2 j')
答案 1 :(得分:0)
library(tidyverse)
d <- tibble(
id = c(1, 1, 1, 2, 2),
somevalue = c('ab', 'cd', 'i', 'o', 'j')
)
d %>%
group_by(id) %>%
mutate(index = 1) %>%
mutate(index = cumsum(index))
#> # A tibble: 5 x 3
#> # Groups: id [2]
#> id somevalue index
#> <dbl> <chr> <dbl>
#> 1 1 ab 1
#> 2 1 cd 2
#> 3 1 i 3
#> 4 2 o 1
#> 5 2 j 2