我想为特定行移动列中的值,并将列中的其他行向下移动一个?
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)
我有一个包含 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)