R подсчет вхождений похожих строк кадра данных - PullRequest
3 голосов
/ 04 апреля 2010

У меня есть данные в следующем формате, который называется 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"), который будет подсчитывать все предыдущие строки, которые имеют одинаковые значения указанных переменных?

Я получил помощь по аналогичной проблеме - просто выделил все строки с одинаковыми значениями для указанных столбцов, поэтому я предположил, что мог бы просто написать цикл вокруг этого, но мне он кажется неэффективным. 1012 *

Ответы [ 3 ]

9 голосов
/ 04 апреля 2010

Хорошо, давайте сначала сделаем это в простом случае, когда у вас есть только один столбец.

> 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 голос
/ 04 апреля 2010

Хорошо, я использовал ответ, который у меня был на другой вопрос, и разработал цикл, который, я думаю, будет работать. Вот что я собираюсь использовать:

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)

Пожалуйста, прокомментируйте, если я допустил ошибку, и это не сработает, но я думаю, что понял это. Спасибо!

0 голосов
/ 16 февраля 2011

У меня есть решение, которое я выяснил со временем (извините, я давно его не проверял)

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, сколько должен, поэтому я открыт для предложений.

Надеюсьэто помогает!

...