递归地标记data.frame中的重复项
考虑到测试数据集递归地标记data.frame中的重复项,r,duplicates,uniqueidentifier,R,Duplicates,Uniqueidentifier,考虑到测试数据集 dat=data.frame(name=c('A','A','B','c','c','c'),val=c(1,1,2,2,3,2)) 获得此输出的最有效方法是什么 name val A 1 A-1 1 B 2 C 2 C-1 3 C-2 2 因此,只需使用自定义标识符标记重复项。 我可以考虑使用粘贴(dat[which(duplicated(dat$name)),1],“-1”,sep='')用公共标识符标记它们,但这只会将“-1”放在所有重复的标识符
dat=data.frame(name=c('A','A','B','c','c','c'),val=c(1,1,2,2,3,2))
获得此输出的最有效方法是什么
name val
A 1
A-1 1
B 2
C 2
C-1 3
C-2 2
因此,只需使用自定义标识符标记重复项。
我可以考虑使用粘贴(dat[which(duplicated(dat$name)),1],“-1”,sep='')
用公共标识符标记它们,但这只会将“-1”放在所有重复的标识符之前。如果该项目第三次出现,请用“-2”标记,依此类推
干杯这并不是你想要的,但你可以试试这个:
within(dat, {
Name <- paste(name, as.numeric(ave(as.character(name),
name, FUN = seq_along)) - 1,
sep = "-")
rm(name)
})
# val Name
# 1 1 A-0
# 2 1 A-1
# 3 2 B-0
# 4 2 C-0
# 5 3 C-1
# 6 2 C-2
在(dat{
名称使用make.unique
:
transform(dat,name=make.unique(as.character(name),sep="-"))
name val
1 A 1
2 A-1 1
3 B 2
4 C 2
5 C-1 3
6 C-2 2
行顺序可以更改吗?@RomanLuštrik是的,没关系,我以后可以排序!!好吧,我想这肯定是最重要的!我知道make.names
,但不知道make.unique
。谢谢!这是一个很好的方式,谢谢!!
name val newname
1 A 1 A-0
2 A 1 A-1
3 B 2 B-0
4 C 2 C-0
5 C 3 C-1
6 C 2 C-2
within(dat, {
Name <- paste(name, as.numeric(ave(as.character(name),
name, FUN = seq_along)) - 1,
sep = "-")
rm(name)
})
# val Name
# 1 1 A-0
# 2 1 A-1
# 3 2 B-0
# 4 2 C-0
# 5 3 C-1
# 6 2 C-2
within(dat, {
name <- as.character(name)
Name <- as.numeric(ave(name, name, FUN = seq_along)) - 1
Name <- ifelse(Name == 0, name, paste(name, Name, sep = "-"))
rm(name)
})
# val Name
# 1 1 A
# 2 1 A-1
# 3 2 B
# 4 2 C
# 5 3 C-1
# 6 2 C-2
transform(dat,name=make.unique(as.character(name),sep="-"))
name val
1 A 1
2 A-1 1
3 B 2
4 C 2
5 C-1 3
6 C-2 2