我有一些数据:
test <- data.frame(A=c("aaabbb",
"aaaabb",
"aaaabb",
"aaaaab",
"bbbaaa")
)
Run Code Online (Sandbox Code Playgroud)
等等.所有元素都是相同的长度,并且在我得到之前已经排序.
我需要建立一个新的行列,"第一","第二","第三",之后的任何内容都可以留空,并且需要考虑关系.所以在上面的例子中,我想获得以下输出:
A B
aaabbb First
aaaabb Second
aaaabb Second
aaaaab Third
bbbaaa
bbbbaa
Run Code Online (Sandbox Code Playgroud)
我查看了rank()和其他一些使用它的帖子,但我无法让它去做我想要的.
这个怎么样:
test$B <- match(test$A , unique(test$A)[1:3] )
test
A B
1 aaabbb 1
2 aaaabb 2
3 aaaabb 2
4 aaaaab 3
5 bbbaaa NA
6 bbbbaa NA
Run Code Online (Sandbox Code Playgroud)
执行此操作的多种方法之一。可能不是最好的,但很容易想到并且相当直观。您可以使用unique,因为您收到的数据已预先排序。
当数据被排序时,另一个值得考虑的合适函数是rle,尽管在这个例子中它稍微有点迟钝:
rnk <- rle(as.integer(df$A))$lengths
rnk
# [1] 1 2 1 1 1
test$B <- c( rep( 1:3 , times = rnk[1:3] ) , rep(NA, sum( rnk[-c(1:3)] ) ) )
Run Code Online (Sandbox Code Playgroud)
rle计算向量中相等值的运行长度(以及我们在这里并不真正关心的值) - 所以这又有效,因为您的数据已经排序。
如果您不必在第三个排名项之后留有空格,那就更简单(并且更具可读性):
test$B <- rep(1:length(rnk),times=rnk)
Run Code Online (Sandbox Code Playgroud)