我有一个包含2列的数据框,Item和Rank
a <- data.frame(item=c('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'),rank=1:26)
我想更改项目的排名&#39; t&#39;目前的等级是20到10级,并且将当前等级为10的项目移动,即&#39; j&#39;通过一个等级下降,所以它得到新的等级11,依此类推,其余的数据框用“&#39;获得新的排名20 数据框看起来像这样
b <- data.frame(item=c('a','b','c','d','e','f','g','h','i','t','j','k','l','m','n','o','p','q','r','s','u','v','w','x','y','z'),rank=1:26)
答案 0 :(得分:2)
如果你知道你将改变哪些等级,你可以使用这样的函数,而x
是data.frame,y
你要改变的值的等级z
目标等级。
foo <- function(x, y, z){
x$rank[c(z, y)] <- c(z+0.1, z) # specify the new ranks
x <- x[order(x$rank),] # order
x$rank <- 1:nrow(x) # update the rank
x}
foo(a, 20, 10)
item rank
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6
7 g 7
8 h 8
9 i 9
20 t 10
10 j 11
11 k 12
12 l 13
13 m 14
14 n 15
15 o 16
16 p 17
17 q 18
18 r 19
19 s 20
21 u 21
22 v 22
23 w 23
24 x 24
25 y 25
26 z 26
答案 1 :(得分:1)
这就完成了这项工作,请记住只有降低等级才有效:
rank_ini <- a$rank[a$item == "t"]
new_rank <- 10
to_be_shifted <- a$rank %in% (new_rank:(rank_ini-1))
a$rank[to_be_shifted] <- a$rank[to_be_shifted] + 1
a$rank[a$item == "t"] <- new_rank
a <- a[order(a$rank),]
答案 2 :(得分:0)
您也可以只对项目10到20进行循环移位,而无需重新排名数据。那就是:
v <- a$item[10:20]
a$item[10:20] <- c(tail(v, 1),head(v, -1))
数据强>
a <- data.frame(item=c('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'),rank=1:26, stringsAsFactors = F)