【问题标题】:r - nth occurrence in a dataframe [duplicate]r - 数据框中的第 n 次出现 [重复]
【发布时间】:2015-07-23 10:23:15
【问题描述】:

我有一个包含两列(名字和州)的 data.frame。

my.df = data.frame(FirstName = c('John', 'Paul', 'John', 'Sarah', 'Haley', 'Paul', 'John'),
                   State = c('VIC', 'NSW', 'VIC', 'QLD', 'TAS', 'NSW', 'VIC'))

FirstName State
   John   VIC
   Paul   NSW
   John   VIC
  Sarah   QLD
  Haley   TAS
   Paul   NSW
   John   VIC

我想添加一列,列出 FirstName 列中每个值的第 n 次出现。例如,“John”出现在第 1、3 和 6 行 - 因此新列将在第 1 行列出“1”,在第 3 行列出“2”(因为这是第二次列出“John”)和“3” ' 在第 6 行(因为这是第三次列出 'John')。

我想要的结果如下所示:

FirstName State Index
   John   VIC     1
   Paul   NSW     1
   John   VIC     2
  Sarah   QLD     1
  Haley   TAS     1
   Paul   NSW     2
   John   VIC     3

任何帮助将不胜感激

【问题讨论】:

    标签: r


    【解决方案1】:

    或者,如果您感觉 dplyr-ishly 无环:

    new.df <- my.df %>% 
       group_by(FirstName) %>% 
       mutate(Index=1:n())
    

    或者你可以使用row_number()

    或者使用data.table

    library(data.table)
    setDT(my.df)[, Index := seq_len(.N), by = FirstName]
    

    或者只是基础R

    with(my.df, ave(seq(FirstName), FirstName, FUN = function(x) seq(length(x))))
    

    【讨论】:

    • 不,我不是在开玩笑。我只是不知道row_number。也许假装一点友好,除非这就是这里的友好。
    • 我自己也在做同样的事情......
    【解决方案2】:

    一些又快又脏的东西……

    my.df = data.frame(FirstName = c('John', 'Paul', 'John', 'Sarah', 'Haley', 'Paul', 'John'),
                       State = c('VIC', 'NSW', 'VIC', 'QLD', 'TAS', 'NSW', 'VIC'))
    
    my.df$Index = 0
    for(i in 1:nrow(my.df)){
      nameinds = which(my.df$FirstName==my.df$FirstName[i])
      my.df$Index[nameinds] = 1:length(nameinds)
    }
    
    print(my.df)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2022-12-18
      • 1970-01-01
      相关资源
      最近更新 更多