为data.frame提供r中另一列的每个值的索引

时间:2018-05-17 20:10:06

标签: r dataframe

我有一个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))

然而,两者都需要很长时间才能完成,我想知道是否有更快的方法来完成这项工作。

2 个答案:

答案 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