3

我有以下格式的数据,称为 DF(这只是一个简化的示例):

eval.num, eval.count, fitness, fitness.mean, green.h.0, green.v.0, offset.0 random
1         1           1500     1500          100        120        40       232342
2         2           1000     1250          100        120        40       11843
3         3           1250     1250          100        120        40       981340234
4         4           1000     1187.5        100        120        40       4363453
5         1           2000     2000          200        100        40       345902
6         1           3000     3000          150        90         10       943
7         1           2000     2000          90         90         100      9304358
8         2           1800     1900          90         90         100      284333

但是,eval.count 列不正确,我需要修复它。它应该仅通过查看前面的行来报告(green.h.0、green.v.0 和 offset.0)具有相同值的行数。

上面的示例使用了预期值,但假设它们不正确。

如何添加一个新列(比如“计数”),它将计算所有先前具有相同指定变量值的行?

我在一个类似的问题上得到了帮助,即只为指定列选择具有相同值的所有行,所以我想我可以围绕它编写一个循环,但这对我来说似乎效率低下。

4

3 回答 3

9

好的,让我们首先在只有一列的简单情况下进行。

> data <- rep(sample(1000, 5),
              sample(5, 5))
> head(data)
[1] 435 435 435 278 278 278

然后你可以使用 rle 来找出连续的序列:

> sequence(rle(data)$lengths)
[1] 1 2 3 1 2 3 4 5 1 2 3 4 1 2 1

或完全:

> head(cbind(data, sequence(rle(data)$lengths)))
[1,]  435 1
[2,]  435 2
[3,]  435 3
[4,]  278 1
[5,]  278 2
[6,]  278 3

对于多列的情况,可能有很多方法可以应用此解决方案。最简单的方法可能是将paste您关心的列组合在一起形成一个向量。

于 2010-04-03T21:52:10.273 回答
1

Okay I used the answer I had on another question and worked out a loop that I think will work. This is what I'm going to use:

cmpfun2 <- function(r) {
    count <- 0
    if (r[1] > 1)
    {
        for (row in 1:(r[1]-1))
        {
            if(all(r[27:51] == DF[row,27:51,drop=FALSE]))  # compare to row bind
            {
                count <- count + 1
            }
        }
    }
    return (count)
}
brows <- apply(DF[], 1, cmpfun2)
print(brows)

Please comment if I made a mistake and this won't work, but I think I've figured it out. Thanks!

于 2010-04-03T22:36:29.293 回答
0

我有一个随着时间的推移想出的解决方案(对不起,我有一段时间没有检查这个)

checkIt <- function(bind) {

    print(bind)

    cmpfun <- function(r) {all(r == heeds.data[bind,23:47,drop=FALSE])}
    brows <- apply(heeds.data[,23:47], 1, cmpfun)

    #print(heeds.data[brows,c("eval.num","fitness","green.h.1","green.h.2","green.v.5")])
    print(nrow(heeds.data[brows,c("eval.num","fitness","green.h.1","green.h.2","green.v.5")]))
}

请注意,heeds.data 是我的实际数据框,我最初只是打印了几列以确保它正常工作(现在已注释掉)。此外,23:47 是需要检查重复的部分

另外,我真的没有学到我应该学到的 R,所以我愿意接受建议。

希望这可以帮助!

于 2011-02-16T16:36:43.330 回答