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

わかりました。まず、列が 1 つしかない簡単なケースで実行しましょう。

> 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

さて、私は別の質問で持っていた答えを使用して、うまくいくと思うループを作りました。これは私が使用するものです:

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)

私が間違っていてうまくいかない場合はコメントしてください。ありがとう!

于 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 に答える