web-dev-qa-db-ja.com

row_number()に基づいてdata.frameをフィルタリングする

更新:dplyrは、この質問が尋ねられてから更新されており、OPが望むように動作するようになりました

dplyrを使用して、data.frameの2行目から7行目を取得しようとしています。

私はこれをやっています:

require(dplyr)
df <- data.frame(id = 1:10, var = runif(10))
df <- df %>% filter(row_number() <= 7, row_number() >= 2)

しかし、これはエラーをスローします。

Error in rank(x, ties.method = "first") : 
  argument "x" is missing, with no default

私は簡単に作ることができることを知っています:

df <- df %>% mutate(rn = row_number()) %>% filter(rn <= 7, rn >= 2)

しかし、私の最初の試みがうまくいかない理由を理解したいと思います。

37
Daniel Falbel

実際、dplyrのslice関数は、この種のサブセット用に作成されています。

df %>% slice(2:7)

(私はパーティーに少し遅れていますが、将来の読者のためにこれを追加すると思いました)

76

row_number()関数は、各要素の行番号を単に返すだけではないため、希望どおりに使用することはできません。

•「row_number」:「rank(ties.method = "first")」と同等

_row_number_が欲しいものを実際に言っているわけではありません。あなたの場合:

_df %>% filter(row_number(id) <= 7, row_number(id) >= 2)
_

idがソートされているため、row_number(id)が_1:10_であるため機能します。このコンテキストでrow_number()がどのように評価されるかわかりませんが、2回目に呼び出されたときにdplyrがそれをフィードするために使い果たされ、あなたは同等のものを取得します:

_> row_number()
Error in rank(x, ties.method = "first") : 
  argument "x" is missing, with no default
_

それはあなたのエラーです。

とにかく、それはnot行を選択する方法です。

単に_df[2:7,]_に添字を付ける必要があります。または、どこでもパイプを使用する場合:

_> df %>% "["(.,2:7,)
  id        var
2  2 0.52352994
3  3 0.02994982
4  4 0.90074801
5  5 0.68935493
6  6 0.57012344
7  7 0.01489950
_
28
Spacedman

パイプラインで行番号ベースのフィルタリングを行う別の方法を次に示します。

    df <- data.frame(id = 1:10, var = runif(10))

    df %>% .[2:7,]

    > id     var
      2  2 0.28817
      3  3 0.56672
      4  4 0.96610
      5  5 0.74772
      6  6 0.75091
      7  7 0.05165
7
dabsingh