我想将列中的值移动到特定行,并将列中的其他行向下移动一行?

时间:2016-09-08 08:34:58

标签: r dataframe ranking

我有一个包含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)

3 个答案:

答案 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)