【问题标题】:Create id column of repeated rows [duplicate]创建重复行的id列[重复]
【发布时间】:2020-05-25 20:16:22
【问题描述】:

已编辑:

我有一个非常简单的问题。我有一个重复行的数据框(已经给出)。我想识别每个唯一的行并添加一个带有 ID 号的列。

原来的表有几千行,我这里简化一下。可以通过这种方式创建一个玩具 df。

df <- data.frame(var1 = c('a', 'a', 'a', 'b', 'c', 'c', 'a'), 
                 var2 = c('d', 'd', 'd', 'e', 'f', 'f', 'c'))

对于每个唯一的行,我想要一个数字 ID:

  var1 var2  ID
1    a    d   1
2    a    d   1
3    a    d   1
4    b    e   2
5    c    f   3
6    c    f   3
7    a    c   4

/已编辑

【问题讨论】:

  • 如何扩展结果中的行?
  • 到目前为止你尝试过什么?由于您从 3 行变为 6 行,因此了解您的处理方式会很有帮助,但目前尚不清楚这是如何发生的
  • 例子错了,抱歉

标签: r rows tidyverse


【解决方案1】:

这是使用cumsum + duplicated 的基本 R 解决方案,即,

df$ID <- cumsum(!duplicated(df))

这样

> df
  var1 var2 ID
1    a    d  1
2    a    d  1
3    a    d  1
4    b    e  2
5    c    f  3
6    c    f  3
7    a    c  4

【讨论】:

    【解决方案2】:

    编辑

    好吧,OP完全改变了这个问题。对于更新后的问题,我们可以做

    df$ID <- match(paste0(df$var1, df$var2), unique(paste0(df$var1, df$var2)))
    

    原答案

    一种方法是使用来自tidyruncount

    library(dplyr)
    df %>% mutate(ID = row_number()) %>% tidyr::uncount(ID, .remove = FALSE)
    
    #    var1 var2 ID
    #1      a    d  1
    #2      b    e  2
    #2.1    b    e  2
    #3      c    f  3
    #3.1    c    f  3
    #3.2    c    f  3
    

    在基础 R 中,我们可以在数据框中创建一个行号列,并基于此重复行。

    df$ID <- seq(nrow(df))
    df[rep(df$ID, df$ID), ]
    

    数据

    df <- structure(list(var1 = structure(1:3, .Label = c("a", "b", "c"
    ), class = "factor"), var2 = structure(1:3, .Label = c("d", "e", 
    "f"), class = "factor")), row.names = c(NA, -3L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 2020-01-19
      • 2019-02-04
      • 1970-01-01
      • 2021-11-12
      • 2023-01-31
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多