我有一個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
如何做到這一點,將不勝感激任何想法。
乾杯,
安蒂
我有一個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
如何做到這一點,將不勝感激任何想法。
乾杯,
安蒂
比方說,您的數據(按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)))
不知道,如果這是在您的具體情況適當的,但你也可以只粘貼在一起Column1
和Column2
,創建一個唯一的標識符...
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
這實際上是更準確的解決方案,因爲我不想爲非重複字符串添加後綴。但兩者都適合我的目的。乾杯! – Antti
可能多一點的一種解決方法,但是這部分可能是不太一樣的需求更加有用和簡單的人。 make.names
與unique=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"
就像我說的,更多的解決方法在這裏,但給出了一些選擇。
非常感謝!這解決了它整齊。 – Antti