【问题标题】:R unique ID renumbering for each group in a data.frame为data.frame中的每个组重新编号的R唯一ID
【发布时间】:2015-04-04 14:37:55
【问题描述】:

我想基于 3 列为每个不同的组创建一个唯一的连续数字 ID,但对于每个组,ID 必须从 1 到 n 开始。

使用Creating a unique ID 的解决方案,我可以创建唯一的 ID,但它们对于整个数据帧是连续的。

k1 <- c(1,1,1,1,1,1,1,1,1,1)
k2 <- c(1,1,1,1,1,2,2,2,2,2)
k3 <- rep(letters[1:2],5)

df <- as.data.frame(cbind(k1,k2, k3))

d <- transform(df, id = as.numeric(interaction(k1,k2,k3, drop=TRUE)))

d <- d[with(d, order(k1,k2,k3)),]

结果是

> d k1 k2 k3 标识 1 1 1 一 1 3 1 1 一 1 5 1 1 一 1 2 1 1 乙 3 4 1 1 乙 3 7 1 2 一 2 9 1 2 一 2 6 1 2 乙 4 8 1 2 乙 4 10 1 2 乙 4

我想拥有

> d k1 k2 k3 标识 1 1 1 一 1 3 1 1 一 1 5 1 1 一 1 2 1 1 乙 2 4 1 1 乙 2 7 1 2 一 1 9 1 2 一 1 6 1 2 乙 2 8 1 2 乙 2 10 1 2 乙 2

【问题讨论】:

    标签: r dataframe unique


    【解决方案1】:

    尝试使用链接中提到的data.table

    library(data.table)
    
    setDT(df)[,id:=.GRP,by=list(k1,k3)][]
    
    #    k1 k2 k3 id
    # 1:  1  1  a  1
    # 2:  1  1  b  2
    # 3:  1  1  a  1
    # 4:  1  1  b  2
    # 5:  1  1  a  1
    # 6:  1  2  b  2
    # 7:  1  2  a  1
    # 8:  1  2  b  2
    # 9:  1  2  a  1
    #10:  1  2  b  2
    

    【讨论】:

    • 但是这种方式 k2 它不被用来评估 id,如果我插入它会给我返回第一个解决方案。
    • 根据你提出的结果,k2对确定id没有影响;)
    • 在这种特殊情况下,甚至可以省略 k1。
    【解决方案2】:

    试试

     d$id <- with(d, ave(id, k2, FUN=function(x) as.numeric(factor(x))))
     d$id 
     #[1] 1 1 1 2 2 1 1 2 2 2
    

    【讨论】:

    • 它有效 :) 太好了。但这取决于以前的ID,对吗?如何一次性获得身份证?
    • @jcarlos 我刚刚使用了您之前创建的“id”。你可以直接在interaction(..)群里使用
    • @jcarlos 我认为 data.table (ColonelBeauvel) 的选项会更直接,因为它有 .GRP
    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 2021-04-09
    相关资源
    最近更新 更多