R计算类似行数据帧的出现次数

时间:2010-04-03 20:25:14

标签: r count duplicates dataframe

我有以下格式的数据,称为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)具有相同值的行数。

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

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

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

3 个答案:

答案 0 :(得分: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您关心的列,以形成单个向量。

答案 1 :(得分:1)

好吧,我使用了我在另一个问题上得到的答案,并制定了一个我觉得可行的循环。这就是我将要使用的内容:

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)

如果我犯了错误,请发表评论但这不起作用,但我想我已经弄明白了。谢谢!

答案 2 :(得分: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,所以我愿意接受建议。

希望这有帮助!