2016-09-08 2 views
0

私は現在ランク10をランク付けし、その現在のランク10すなわちある項目をシフトする20項目の「T」のランクを変更したい2列、アイテムやランク特定の行の列の値をシフトし、その列の他の行を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) 

とのデータフレームを持っています「S」を持つデータフレームの残りのダウンので、1つのランク「J」は、新しいランク11を取得し、その上で新しいランク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) 

答えて

2

あなたはxはdata.frame、あなたがzターゲットランクを変更したい値のyランクにあるときに、このような関数を使用することができます変更されますランクいるわかっている場合。

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
のようになります。

これは仕事ですが、あなたがランクを下げる場合にのみ働くことを覚えておいてください:

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),] 
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) 
関連する問題