2015-12-14 57 views
-1

我想寫一些代碼,有效地將數據框的第一列中的值向上或向下移動。它向上或向下移動的條件如下:如何將數據框的列中的值向上或向下移動?

1)如果數據框'playerlist'中選定元素正下方的值與所選元素的值之間的差值小於或等於在數據框中所選元素正上方的值與所選元素的值之間的差異,則第一列中的數據向上移動(即,玩家列表[1,1]變爲玩家列表[2,1],玩家列表[2, 1]變成播放列表[3,1]等)。 2)如果反過來是正確的,(即數據框'playerlist'中選擇元素正下方的值和所選元素的值之間的差值(僅)大於直接值之間的差值在數據框中所選元素的上方和所選元素的值),則數據向下移動(即,玩家列表[3,1]變成玩家列表[2,1],玩家列表[2,1]變成播放列表[1,1] ]等)。 3)如果上述值或選定元素值的下面值都小於選定值,則不會發生任何反應。

NB:

NUMBER_OF_PLAYERS *是一個外部輸入時,在下面的示例中,具有值7運行(即,這意味着playerlist包含7行

**拍攝X是的行。所選擇的數據(即這樣選擇的數據始終是playerlist [X,1])。

dicear <- function(x){ #x is the player playing the card 
    y <- x-1 
    z <- x+1 
    if(x <- 1){ 
     y <- number_of_players 
    } 
    if(x <- number_of_players){ 
     z <- 1 
    } 
    if(playerlist[x, 1]>playerlist[z, 1] & (playerlist[x, 1]-playerlist[z, 1]) >= (playerlist[x, 1] - playerlist[y, 1])){ 
     for(i in 1:nrow(playerlist)){ 
     dummy <- i+1 
     if(i <- nrow(playerlist)){ 
      dummy <- 1 
      } 
     else{ 
      dummy <- i+1 
      } 
     playerlist[i, 1] <<- playerlist[dummy, 1] 
    } 
    } 
    else { 
     if(playerlist[x, 1]>playerlist[y, 1] & (playerlist[x, 1]-playerlist[y, 1]>(playerlist[x, 1]-playerlist[z, 1]))){ 
      for(i in 1:nrow(playerlist)){ 
      dummy <- i-1 
      if(i <- 1){ 
       dummy <- nrow(playerlist) 
      } 
      else{ 
       dummy <- i-1 
       } 
      playerlist[i, 1] <<- playerlist[dummy, 1] 
     } 
    } 
} 
} 
+0

我不知道,我完全以下,但好像你正在試圖建立某種基於上面和下面的一些目標項目之間的差異排序算法。那是對的嗎? – giraffehere

+0

此外,您的算法是否會在數據框的第一個和最後一個項都失敗? – giraffehere

+0

問題是什麼? –

回答

0

爲了幫助說明,你有問題,我提供一些指引,使這個問題我更容易接近。在矢量中移動數據更容易考慮比在數據幀的列中移動數據。數據幀列可以被矢量化(保存爲矢量)。您的問題要求評估之前的值(i-1)與以下值(i+1)之間的差異,其中i是正在評估的值。如給出的那樣,這排除了第一個和最終的值。第一個值沒有以前的值,最終值沒有下一個值來執行差異計算。我將專注於給定矢量中的單個位置。

鑑於矢量,z <- c(1, 2, 8, 4, 5)讓我們通過您的指導方針給出的程序。爲了簡單起見,計算評估z[2]差異的絕對值。

> abs(z[1] - z[2]) 
[1] 1 
> abs(z[2] - z[3]) 
[1] 6 

z[2]下移修改向量的abs(z[2] - z[3]) > abs(z[1] -z[2])和值設定爲「Z < - C(1,8,2,4,5)`。

重複z[2](現在爲8)的程序,得出以下結果:z <- c(1,2,8,4,5)這是原始向量。因此,讓我們測試z[3],這是2:z <- c(1,2,8,4,5)。再次回到原始矢量。我的想法可能有缺陷。如果我犯了一個錯誤,請在評論中提供例子。

考慮到這一點,以下內容可能會有用。

z <- c(1,2,8,4,5) 
for(i in 1:5) print(c(z[i], z[-i])) 

如果你想要做的是圍繞移動一個特定的值,上面給出的簡單for循環將print()那些序列,其中i是從一個至5(1:5)迭代變量。當i前進時,所得矢量將位置值z[i]移動到第一位置(即z[1] <- z[i])。沒有一個值丟失。

> for(i in 1:5) print(c(z[i], z[-i])) 
[1] 1 2 8 4 5 
[1] 2 1 8 4 5 
[1] 8 1 2 4 5 
[1] 4 1 2 8 5 
[1] 5 1 2 8 4 

您還可以使用diff()來計算矢量中的差異。

> diff(z) 
[1] 1 6 -4 1 
> abs(diff(z)) 
[1] 1 6 4 1 

通過diff()計算的值本質上是一個要評估,其中通過給定diff()第一值是z[1]z[2]之間的差值相同的值;第二個是z[2]z[3]之間的差異,依此類推。您可以使用diff()的差異值進行比較。

> diffs <- diff(z) 
> diffs[1] > diffs[2] | diffs[2] <= diffs[3] 
[1] FALSE 
> diffs[2] > diffs[3] | diffs[3] <= diffs[4] 
[1] TRUE 

記住z有5個元素,而diffs只有4個元素。

您可以提供關於您的問題的一些細節,如對什麼樣的變化,你建議在數據幀看playerlist的例子和輸出。

另一個可能有用或不可用的選項是sort()函數。當我第一次看到你的問題,我想也許你試圖排序順序在一個時間你的數據之一,例如改變一個球員的根據遊戲的依次排名。您可以使用sort()來安排您的數據從最小到最大。

> sort(z) 
[1] 1 2 4 5 8 

這裏有一個有趣的原理來探索。

相關問題