1

データフレーム(キャッチ)で、「tspp.name」変数が「elasmo.name」変数と同じである行のみを選択したいと思います。

たとえば、この場合は行#74807と#74809が選択されますが、行#74823は選択されません。これは、elasmo.nameが「skate」でtspp.nameが「Northernshrimp」であるためです。

これには簡単な答えがあると思いますが、まだ見つけていません。ヒントをいただければ幸いです。

> catch[4:6,]
      gear tripID obsID sortie setID       date     time NAFO    lat   long      dur depth bodymesh
74807 GRL2 G00001     A      1    13 2000-01-04 13:40:00   2H 562550 594350 2.000000   377       80
74809 GRL2 G00001     A      1    14 2000-01-04 23:30:00   2H 562550 594350 2.166667   370       80
74823 GRL2 G00001     A      1    16 2000-01-05 07:45:00   2H 561450 593050 3.000000   408       80
      codendmesh mail.fil long.fil nbr.fil hook.shape hook.size hooks VTS tspp       tspp.name elasmo
74807         45       NA       NA      NA                   NA    NA 3.3 2211 Northern shrimp   2211
74809         45       NA       NA      NA                   NA    NA 3.2 2211 Northern shrimp   2211
74823         45       NA       NA      NA                   NA    NA 3.3 2211 Northern shrimp    211
          elasmo.name kept discard Tcatch     date.1 latitude longitude       EID
74807 Northern shrimp 2747      50   2797 2000-01-04 56.91667 -60.21667 G00001-13
74809 Northern shrimp 4919     100   5019 2000-01-04 56.91667 -60.21667 G00001-14
74823          Skates    0      50     50 2000-01-05 56.73333 -60.00000 G00001-16
                                 fgear
74807 Shrimp trawl (stern) with a grid
74809 Shrimp trawl (stern) with a grid
74823 Shrimp trawl (stern) with a grid
4

1 に答える 1

3

as.is=TRUE私は問題が何であるかを知っています-コマンドに引数を追加することによって、データを「そのまま」読み取る必要がread.csvあります(おそらくすべてをロードするために使用しました)。これがないと、文字列は要素として保存され、上記で提案されたすべてのメソッドは失敗します(あなたが発見したように!)

データを正しく読み込んだら、次のいずれかを使用できます

catch[which(catch$tspp.name == catch$elasmo.name),]

また

subset(catch, tspp.name == elasmo.name)

一致する行を取得するには、最初の行を省略しないでください。省略しないwhichと、NAとの比較を行うときにコードが失敗します。

以下は、これらすべてのポイントを明示的に示す小さな製造データセットを使用した30秒の例です。

まず、次のようなテキストファイルをディスク上に作成します(「F:/test.dat」として保存しましたが、どこにでも保存できます)...

col1~col2
a~b
a~a
b~b
c~NA
NA~d
NA~NA

上記で提案された方法が失敗するのを確認するために、係数を文字列に変換せずにロードしてみましょう。

> dat=read.csv("F:/test.dat",sep="~")  # don't forget to check the filename

> dat[which(dat$col1==dat$col2),]
Error in Ops.factor(dat$col1, dat$col2) : level sets of factors are different

> dat[dat$col1==dat$col2,]
Error in Ops.factor(dat$col1, dat$col2) : level sets of factors are different

> subset(dat,col1==col2)
Error in Ops.factor(col1, col2) : level sets of factors are different

これはまさにあなたが抱えていた問題です。入力するdat$col1と、最初の要素には因子レベルがあり、2番目のdat$col2要素には因子レベルがあることがわかります。したがって、エラーメッセージが表示されます。a b ca b d

同じことをしましょう。ただし、今回は「そのまま」データを読み込みます。

> dat=read.csv("F:/test.dat",sep="~",as.is=TRUE)  # note the as.is=TRUE

> dat[which(dat$col1==dat$col2),]
  col1 col2
2    a    a
3    b    b

> dat[dat$col1==dat$col2,]
     col1 col2
2       a    a
3       b    b
NA   <NA> <NA>
NA.1 <NA> <NA>
NA.2 <NA> <NA>

> subset(dat,col1==col2)
     col1 col2
2    a    a
3    b    b

ご覧のとおり、最初の方法(に基づくwhich)と3番目の方法(に基づくsubset)はどちらも正しい答えを示しますが、2番目の方法はNAとの比較によって混乱します。subset私の意見ではそれが最も良い方法であるため、私は個人的にこの方法を提唱します。

最後の注意:データフレームの要素として文字列を生成する方法は他にもあります。これらの問題をすべて回避するには、stringsAsFactors = FALSEを使用してデータフレームを作成するときは常に、最後に引数を含めることを忘れないでくださいdata.frame。たとえばdat、Rでオブジェクトを直接作成する正しい方法は次のとおりです。

dat=data.frame(col1=c("a","a","b","c",NA,NA), col2=c("b","a","b",NA,"d",NA),
                         stringsAsFactors=FALSE)

と入力するdat$col1dat$col2、正しく解釈されていることがわかります。もう一度試してみて、stringsAsFactors引数を省略した(またはTRUEに設定した)と、それらのひどい要素が表示されます(ディスクからロードする危険な最初の方法のように)。

つまり、常に覚えておいas.is=TRUEstringsAsFactors=FALSE、コマンドの使用方法を学んsubsetでください。そうすれば、間違いを犯すことはありません。

お役に立てれば :)

于 2012-06-10T02:52:53.547 に答える