我有一些数据:
test <- data.frame(A=c("aaabbb",
"aaaabb",
"aaaabb",
"aaaaab",
"bbbaaa")
)
等等。所有元素的长度都相同,并且在我获取它们之前就已经排序了。
我需要创建一个新的排名列,“第一”、“第二”、“第三”,之后的任何内容都可以留空,并且需要考虑平局。因此,在上述情况下,我想得到以下输出:
A B
aaabbb First
aaaabb Second
aaaabb Second
aaaaab Third
bbbaaa
bbbbaa
我查看了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
执行此操作的多种方法之一。可能不是best,但是很容易浮现在脑海中并且相当直观。您可以使用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)] ) ) )
rle
计算向量中相等值的运行长度(以及我们在这里并不真正关心的值) - 所以这又有效,因为您的数据已经排序。
如果你不这样做have在第三个排名项目之后有空白,则更简单(并且更具可读性):
test$B <- rep(1:length(rnk),times=rnk)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)