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

I want to shift the value in a column for a particular row and shift the other rows one down in the column ?

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

我想将当前排名为 20 的项目 't' 的排名更改为排名 10,并将当前排名为 10 的项目(即 'j' 下移一级,这样就得到了新的排名 11 等等,对于数据框的其余部分 's' 获得新的排名 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)

这样就可以了,记住它只有在你降低等级时才有效:

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),]

如果您知道要更改的排名,您可以使用这样的函数,而 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

您也可以只对项目 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)