假设我的数据如下所示.
在这整个数据中,总共有3*A,2*B,2*C,只有1 D,E和F.
data <- read.table(textConnection("
col1 col2
A B
A C
B A
C D
E F
"), header = TRUE)
Run Code Online (Sandbox Code Playgroud)
我想要做的是保持秩序和内容相同,但要使它们与众不同.例如,A变为A.1,A.2和A.3.
col1 col2
A.1 B.2
A.2 C.2
B.1 A.3
C.1 D
E F
Run Code Online (Sandbox Code Playgroud)
有什么聪明的方法可以做到这一点吗?
我知道我可以使用make.unique或make.names,但看起来它只适用于一列,而不适用于整个数据集.
使用:
dat[] <- make.unique(as.character(unlist(dat)))
Run Code Online (Sandbox Code Playgroud)
得到:
Run Code Online (Sandbox Code Playgroud)> dat col1 col2 1 A B.1 2 A.1 C.1 3 B A.2 4 C D 5 E F
一种选择是unlist数据集,然后使用未列出的向量ave获取序列paste并将其分配回原始数据集
v1 <- as.character(unlist(data))
data[] <- sub("\\.$", "", paste(v1, ave(v1, v1,
FUN = function(x) if(length(x)>1) seq_along(x) else ""), sep="."))
data
# col1 col2
#1 A.1 B.2
#2 A.2 C.2
#3 B.1 A.3
#4 C.1 D
#5 E F
Run Code Online (Sandbox Code Playgroud)