在R

时间:2019-01-30 20:07:27

标签: r dataframe

我有一个数据框,其属性之一是原始对象标识号。我已将某些记录分为两个对象。现在,我想分配一个新的对象标识符,该标识符包括原始名称和一个从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 个答案:

答案 0 :(得分:1)

在这里,您可以使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <table> <thead> <tr> <th>Mon</th> <th>Tue</th> <th>Wed</th> <th>Thu</th> <th>Fri</th> </tr> </thead> <tbody id="timeTableBody"></tbody> </table>软件包来解决方案

dplyr

答案 1 :(得分:0)

为了完整起见,这也是一个简洁的解决方案,它使用了包中的SliverChildListDelegate函数:

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 ,这也将起作用。