代码之家  ›  专栏  ›  技术社区  ›  kl-higgins

在r中指定包含原始名称的标识符值

  •  1
  • kl-higgins  · 技术社区  · 6 年前

    我有一个数据帧,其中一个属性是原始对象标识符编号。我已将一些记录拆分为两个对象。现在,我要分配一个新的对象标识符,其中包括原始名称和从a到z的字母(幸运的是,我的数据集每个原始标识符最多有12个重复项)。我发现了一个带有for循环的方法,但是考虑到我的数据集有超过750 000条记录,它非常长。有什么比我的解决方案更直接的吗?我还没有掌握在R中创建apply/dlyr类型命令。

    #create data.frame
    sample = data.frame(ID_obj=c(1:6, 4, 2), x=c(1,1,1,1,2,2,2,4), y=c("a3", "4a", "5b", "8b"))
    
    #reorder sample by ID_obj
    sample<-sample[order(sample$ID_obj),]
    
    #create empty vector
    test<-numeric(0)
    for (i in 1:6)
    {
    add<-letters[1:dt[i,"Freq"]]
    test<-c(test, add)
    }
    
    sample$ID_obj_new<-paste(sample$ID_obj, test, sep="_")
    #  ID_obj x  y ID_obj_new
    #1      1 1 a3        1_a
    #2      2 1 4a        2_a
    #8      2 4 8b        2_b
    #3      3 1 5b        3_a
    #4      4 1 8b        4_a
    #7      4 2 5b        4_b
    #5      5 2 a3        5_a
    #6      6 2 4a        6_a
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   kl-higgins    6 年前

    给你一个使用这个包的解决方案 dplyr

    library(dplyr)
    library(bindrcpp)
    
    sample %>% 
        group_by(ID_obj) %>% 
        mutate(ID_obj_new = paste(ID_obj, letters[1:n()], sep="_")) %>% 
        ungroup()
    
        2
  •  0
  •   Uwe    6 年前

    为了完整起见,这里还有一个简洁的解决方案,它使用 rowid() 函数来自 包裹:

    library(data.table)
    setDT(sample)[, ID_obj_new := paste(ID_obj, letters[rowid(ID_obj)], sep = "_")][]
    
       ID_obj x  y ID_obj_new
    1:      1 1 a3        1_a
    2:      2 1 4a        2_a
    3:      2 4 8b        2_b
    4:      3 1 5b        3_a
    5:      4 1 8b        4_a
    6:      4 2 5b        4_b
    7:      5 2 a3        5_a
    8:      6 2 4a        6_a
    

    即使 sample 不是命令。