【问题标题】:Add ID column by group [duplicate]按组添加ID列[重复]
【发布时间】:2012-11-14 00:44:34
【问题描述】:

我想根据经纬度两列在 R 中创建一个唯一 ID,以便重复的位置具有相同的集群 ID。

例如:

LAT        LONG    Cluster_ID
13.5330 -15.4180   1
13.5330 -15.4180   1
13.5330 -15.4180   1
13.5330 -15.4180   1
13.5330 -15.4170   2
13.5330 -15.4170   2
13.5330 -15.4170   2
13.5340 -14.9350   3
13.5340 -14.9350   3
13.5340 -15.9170   4
13.3670 -14.6190   5

【问题讨论】:

    标签: r validation unique


    【解决方案1】:

    这是使用interaction 的一种方式。

    d <- read.table(text='LAT LONG
    13.5330 -15.4180 
    13.5330 -15.4180 
    13.5330 -15.4180 
    13.5330 -15.4180 
    13.5330 -15.4170 
    13.5330 -15.4170 
    13.5330 -15.4170 
    13.5340 -14.9350 
    13.5340 -14.9350 
    13.5340 -15.9170 
    13.3670 -14.6190', header=TRUE)
    
    d <- transform(d, Cluster_ID = as.numeric(interaction(LAT, LONG, drop=TRUE)))
    
    #       LAT    LONG Cluster_ID
    # 1  13.533 -15.418          2
    # 2  13.533 -15.418          2
    # 3  13.533 -15.418          2
    # 4  13.533 -15.418          2
    # 5  13.533 -15.417          3
    # 6  13.533 -15.417          3
    # 7  13.533 -15.417          3
    # 8  13.534 -14.935          4
    # 9  13.534 -14.935          4
    # 10 13.534 -15.917          1
    # 11 13.367 -14.619          5
    

    编辑:纳入@Spacedman 的建议,将drop=TRUE 提供给interaction

    【讨论】:

    • drop=TRUE 添加到您的 interaction 呼叫中将为您提供从 1 到 5 的数字,而不是您在此处看到的随机代码。
    • 好的,我还有一个问题。我的数据应该有 1990:2010 的年份,但对于大多数集群来说,缺少一些年份。我希望 R 搜索缺少的内容,然后填写它们。此外,我还想为响应变量创建 NA,并在已创建的新案例中复制其他变量。如果可以的话,请帮忙。谢谢,琼斯
    • @user1835888 评论不是最好的提问地方。使用可重现的示例发布另一个问题,展示您尝试过的内容,有人会帮助您。
    【解决方案2】:

    数据:

    dat <- read.table(text="
    LAT        LONG
    13.5330 -15.4180
    13.5330 -15.4180
    13.5330 -15.4180
    13.5330 -15.4180
    13.5330 -15.4170
    13.5330 -15.4170
    13.5330 -15.4170
    13.5340 -14.9350
    13.5340 -14.9350
    13.5340 -15.9170
    13.3670 -14.6190", header = TRUE)
    

    这些命令创建一个以1开头的id变量:

    comb <- with(dat, paste(LAT, LONG))
    within(dat, Cluster_ID <- match(comb, unique(comb)))
    

    输出:

          LAT    LONG Cluster_ID
    1  13.533 -15.418          1
    2  13.533 -15.418          1
    3  13.533 -15.418          1
    4  13.533 -15.418          1
    5  13.533 -15.417          2
    6  13.533 -15.417          2
    7  13.533 -15.417          2
    8  13.534 -14.935          3
    9  13.534 -14.935          3
    10 13.534 -15.917          4
    11 13.367 -14.619          5
    

    【讨论】:

      【解决方案3】:

      .GRP 已添加到 data.table 1.8.3,允许您执行以下操作:

      # Your data, as a data.frame
      dat <- read.table(text='LAT LONG
      13.5330 -15.4180 
      13.5330 -15.4180 
      13.5330 -15.4180 
      13.5330 -15.4180 
      13.5330 -15.4170 
      13.5330 -15.4170 
      13.5330 -15.4170 
      13.5340 -14.9350 
      13.5340 -14.9350 
      13.5340 -15.9170 
      13.3670 -14.6190', header=TRUE)
      
      # Convert it to a data.table
      # with keys as the combination of LAT and LONG
      library(data.table)
      DT <- data.table(dat, key="LAT,LONG")
      DT[, Cluster_ID:=.GRP, by=key(DT)]
      DT
      #        LAT    LONG Cluster_ID
      #  1: 13.367 -14.619          1
      #  2: 13.533 -15.418          2
      #  3: 13.533 -15.418          2
      #  4: 13.533 -15.418          2
      #  5: 13.533 -15.418          2
      #  6: 13.533 -15.417          3
      #  7: 13.533 -15.417          3
      #  8: 13.533 -15.417          3
      #  9: 13.534 -15.917          4
      # 10: 13.534 -14.935          5
      # 11: 13.534 -14.935          5
      

      【讨论】:

      • 感谢大家的回复。他们工作得很好,这为我节省了很多时间。创建一个唯一的 id 后,我想做的下一件事是复制一些字段并为其他字段创建 NA。我的数据以年为单位,并非所有集群都有所有年份的数据,所以首先我想为所有 id 填补缺失的年份(1990:2010)。然后填写我添加年份的其余字段,并为我想要预测的其他字段创建 NA。
      【解决方案4】:

      比较性能建议的解决方案:

      df <- read.table(text='LAT LONG
      13.5330 -15.4180 
      13.5330 -15.4180 
      13.5330 -15.4180 
      13.5330 -15.4180 
      13.5330 -15.4170 
      13.5330 -15.4170 
      13.5330 -15.4170 
      13.5340 -14.9350 
      13.5340 -14.9350 
      13.5340 -15.9170 
      13.3670 -14.6190', header=TRUE)
      f1 <- function(df, cols) {
          df$id <- as.numeric(interaction(df[cols], drop = TRUE))
          df
      }
      f2 <- function(df, cols) {
          comb <- do.call(paste, c(as.list(df[cols]), sep = "."))
          df$id <- match(comb, unique(comb))
          df
      }
      f2(df, 1:2)
      #>       LAT    LONG id
      #> 1  13.533 -15.418  1
      #> 2  13.533 -15.418  1
      #> 3  13.533 -15.418  1
      #> 4  13.533 -15.418  1
      #> 5  13.533 -15.417  2
      #> 6  13.533 -15.417  2
      #> 7  13.533 -15.417  2
      #> 8  13.534 -14.935  3
      #> 9  13.534 -14.935  3
      #> 10 13.534 -15.917  4
      #> 11 13.367 -14.619  5
      microbenchmark::microbenchmark(f1(df, 1:2), f2(df, 1:2))
      #> Unit: microseconds
      #>         expr     min      lq      mean   median       uq      max neval cld
      #>  f1(df, 1:2) 486.400 510.422 575.26659 573.3945 594.1165 1622.243   100   b
      #>  f2(df, 1:2)  72.952  79.208  86.09265  83.5275  89.7195  159.740   100  a 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-23
        • 1970-01-01
        • 2015-03-09
        • 2021-05-23
        • 1970-01-01
        相关资源
        最近更新 更多