2013-05-20 26 views
2

我有一個R數據框,它有兩列字符串。在其中一列(比如Column1)中有重複的值。我需要重新標記該列,以便它有有序後綴改爲複製串,就像在Column1.new重命名R中的重複字符串

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 

如何做到這一點,將不勝感激任何想法。

乾杯,

安蒂

回答

5

比方說,您的數據(按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 

這使你的Column1值和根據數量的各元素的appearences的。然後利用這些信息與唯一標識符創建新列:

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

不知道,如果這是在您的具體情況適當的,但你也可以只粘貼在一起Column1Column2,創建一個唯一的標識符...

+0

非常感謝!這解決了它整齊。 – Antti

1
d <- read.table(text='Column1 Column2 
1   A 
1   B 
2   C 
2   D 
3   E 
4   F', header=TRUE) 

transform(d, 
    Column1.new = ifelse(duplicated(Column1) | duplicated(Column1, fromLast=TRUE), 
         paste(Column1, ave(Column1, Column1, FUN=seq_along), sep='_'), 
         Column1)) 

# Column1 Column2 Column1.new 
# 1  1  A   1_1 
# 2  1  B   1_2 
# 3  2  C   2_1 
# 4  2  D   2_2 
# 5  3  E   3 
# 6  4  F   4 
+0

這實際上是更準確的解決方案,因爲我不想爲非重複字符串添加後綴。但兩者都適合我的目的。乾杯! – Antti

1

可能多一點的一種解決方法,但是這部分可能是不太一樣的需求更加有用和簡單的人。 make.namesunique=T屬性增加了重複這點和數字的名字:

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

這可能是足以讓一些人。在這裏,您可以抓取重複元素的第一個條目,但不抓取不重複的元素,然後在末尾添加.0

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" 

更換點和取出X

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

可能對你不夠好。但是,如果您希望索引從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" 

就像我說的,更多的解決方法在這裏,但給出了一些選擇。