如何向上或向下移动数据框的列中的值?

时间:2015-12-14 15:37:29

标签: r

我正在尝试编写一些代码,以有效地向上或向下移动数据框第一列中的值。它向上或向下移动的条件如下:

1)如果数据框'playerlist'中所选元素正下方的值与所选元素的值之间的差值小于OR,则等于数据框中所选元素正上方的值之差并且所选元素的值然后第一列中的数据向上移动(即,玩家列表[1,1]变为玩家列表[2,1],玩家列表[2,1]变为播放列表[3,1]等)。

2)如果反之亦然,(即数据框'playerlist'中所选元素正下方的值与所选元素的值之间的差值(仅)超过上面直接值之间的差值数据框中的所选元素和所选元素的值)然后数据向下移动(即,玩家列表[3,1]变为玩家列表[2,1],玩家列表[2,1]变为播放列表[1,1]等)。

3)如果所选元素值的上述值或以下值均未小于所选值,则不会发生任何事情。

NB:

* number_of_players是一个外部输入,在下面的示例中,它以值7运行(即这意味着播放器列表包含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]   
        }
    }
}
}

1 个答案:

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

abs(z[2] - z[3]) > abs(z[1] -z[2])和值z[2]向下移动以将向量修改为&#39; z&lt; - 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是从1到5的迭代变量的序列({ {1}})。当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 有5个元素,而z只有4个元素。

您可以提供有关您的问题的一些详细信息,例如diffs的示例以及您建议在数据框中看到的更改的输出。

另一个可能有用或无用的选项是playerlist功能。当我第一次阅读你的问题时,我想也许你正试图一次一个地对数据进行排序,例如根据游戏的变化来改变玩家的排名。您可以使用sort()将数据从最小到最大排列。

sort()

这里有一个有趣的原则可以探索。