我有一个数据框,其属性之一是原始对象标识号。我已将某些记录分为两个对象。现在,我想分配一个新的对象标识符,该标识符包括原始名称和一个从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
答案 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)
为了完整起见,这也是一个简洁的解决方案,它使用了data.table包中的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
,这也将起作用。