Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归地标记data.frame中的重复项_R_Duplicates_Uniqueidentifier - Fatal编程技术网

递归地标记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