在R中重命名重复的字符串

Ant*_*tti 3 r rename duplicates

我有一个R数据帧,有两列字符串.在其中一列(例如,Column1)中,存在重复值.我需要重新标记该列,以便将重复的字符串重命名为有序后缀,如Column1.new

 Column1   Column2   Column1.new
 1         A         1_1
 1         B         1_2
 2         C         2_1
 2         D         2_2
 3         E         3
 4         F         4
Run Code Online (Sandbox Code Playgroud)

任何有关如何做到这一点的想法将不胜感激.

干杯,

安蒂

adi*_*der 6

假设您的数据(按顺序排列Column1)位于一个名为的对象内tab.首先创建一个运行长度的对象

c1.rle <- rle(tab$Column1)
c1.rle
##lengths: int [1:4] 2 2 1 1
##values : int [1:4] 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

这给出Column1了每个元素的值和相应的出现次数.然后使用该信息创建具有唯一标识符的新列:

tab$Column1.new <- paste0(rep(c1.rle$values, times = c1.rle$lengths), "_",
        unlist(lapply(c1.rle$lengths, seq_len)))
Run Code Online (Sandbox Code Playgroud)

不知道,如果这是在您的具体情况适当的,但你也可以只粘贴在一起Column1,并Column2以创建一个唯一的标识符...


小智 6

可能是一种解决方法,但对于需求不太相同的人来说,其中的一部分可能更有用和更简单。make.names使用unique=T属性添加重复的点和数字名称:

x <- make.names(tab$Column1,unique=T)
> print(x)
[1] "X1"   "X1.1" "X2"   "X2.1" "X3"   "X4"   
Run Code Online (Sandbox Code Playgroud)

这对某些人来说可能已经足够了。然后,您可以在此处抓取重复元素的第一个条目,但不抓取不重复的元素,然后.0在末尾添加 a 。

y <- rle(tab$Column1)
tmp <- !duplicated(tab$Column1) & (tab$Column1 %in% y$values[y$lengths>1])
x[tmp] <- str_replace(x[tmp],"$","\\.0")
> print(x)
[1] "X1.0" "X1.1" "X2.0" "X2.1" "X3"   "X4"
Run Code Online (Sandbox Code Playgroud)

替换点并删除 X

x <- str_replace(x,"X","")
x <- str_replace(x,"\\.","_")
> print(x)
[1] "1_0" "1_1" "2_0" "2_1" "3"   "4" 
Run Code Online (Sandbox Code Playgroud)

可能对你来说已经足够好了。但是,如果您希望索引从 1 开始,请获取数字,添加一个然后将它们放回原处。

z <- str_match(x,"_([0-9]*)$")[,2]
z <- as.character(as.numeric(z)+1)
x <- str_replace(x,"_([0-9]*)$",paste0("_",z))
> print(x)
[1] "1_1" "1_2" "2_1" "2_2" "3"   "4" 
Run Code Online (Sandbox Code Playgroud)

就像我说的,这里有更多的解决方法,但提供了一些选择。