9

サンプリングデータを2つのデータセットに分散させています。loc地理的な位置を説明し、spe見つかった種が含まれています。残念ながら、サンプリングステーションは2つの要素(cruisestation)で記述されているため、両方のデータセットに一意の識別子を作成する必要があります

>loc
  cruise station     lon    lat
1    TY1      A1 53.8073 6.7836
2    TY1       3 53.7757 6.7009
3    AZ7      A1 53.7764 6.6758

>spe
  cruise station     species abundance
1    TY1      A1 Ensis ensis       100
2    TY1      A1    Magelona         5
3    TY1      A1    Nemertea        17
4    TY1       3    Magelona         8
5    TY1       3     Ophelia      1200
6    AZ7      A1     Ophelia       950
7    AZ7      A1 Ensis ensis        89
8    AZ7      A1        Spio         1

ID私が必要としているのは、そのような一意の識別子を追加することです

  cruise station     species abundance     ID
1    TY1      A1 Ensis ensis       100 STA0001
2    TY1      A1    Magelona         5 STA0001
3    TY1      A1    Nemertea        17 STA0001
4    TY1       3    Magelona         8 STA0002
5    TY1       3     Ophelia      1200 STA0002
6    AZ7      A1     Ophelia       950 STA0003
7    AZ7      A1 Ensis ensis        89 STA0003
8    AZ7      A1        Spio         1 STA0003

これがデータです

loc<-data.frame(cruise=c("TY1","TY1","AZ7"),station=c("A1",3,"A1"),lon=c(53.8073, 53.7757, 53.7764),lat=c(6.7836, 6.7009, 6.6758))

spe<-data.frame(cruise=c(rep("TY1",5),rep("AZ7",3)),station=c(rep("A1",3),rep(3,2),rep("A1",3)),species=c("Ensis ensis", "Magelona", "Nemertea", "Magelona", "Ophelia", "Ophelia","Ensis ensis", "Spio"),abundance=c(100,5,17,8,1200,950,89,1))

次にIDloc

 loc$ID<-paste("STA",formatC(1:nrow(loc),width=4,format="d",flag="0"),sep="")

しかし、どうすればにマップできIDますspeか?

私が見つけた方法には、2つのネストされたループが含まれ、私のような手続き型プログラマーにとっては非常にハンサムです(ネストされたループをハンサムと呼ぶことができる場合)。Rの2ライナーがより効率的かつ高速になると確信していますが、それを理解することはできません。私は自分のコードにもっと美しさを本当に求めています、これはとても非Rです。

4

3 に答える 3

5

merge実際、これはベースRでうまくいくケースだと思います:

merge(spe, loc, all.x=TRUE)

  cruise station     species abundance     lon    lat
1    AZ7      A1     Ophelia       950 53.7764 6.6758
2    AZ7      A1 Ensis ensis        89 53.7764 6.6758
3    AZ7      A1        Spio         1 53.7764 6.6758
4    TY1       3    Magelona         8 53.7757 6.7009
5    TY1       3     Ophelia      1200 53.7757 6.7009
6    TY1      A1 Ensis ensis       100 53.8073 6.7836
7    TY1      A1    Magelona         5 53.8073 6.7836
8    TY1      A1    Nemertea        17 53.8073 6.7836

一意の識別子を見つけるには、次を使用しますunique()

unique(paste(loc$cruise, loc$station, sep="-"))
[1] "TY1-A1" "TY1-3"  "AZ7-A1"
于 2012-07-13T15:23:05.583 に答える
3

因子をと組み合わせることができますinteraction

ID列のラベルを気にしないのであれば、解決策は本当に簡単です。

loc <- within(loc, id <- interaction(cruise, station))
spe <- within(spe, id <- interaction(cruise, station))
于 2012-07-13T15:27:38.067 に答える
0

これが結果的にどこにつながるかを示すためだけに(興味深いかもしれません):

すでに述べたように、一意の識別子IDが追加されます。loc

loc$ID<-paste("STA", formatC(1:nrow(loc), width=4, format="d", flag="0"), sep="")

Andrieが提案した merge(spe, loc, all.x=TRUE)ように、必要に応じて data.frames を結合しloc、対応するものが含まれていない可能性のあるすべての要素を削除しますspe(これらを保持する必要がある場合は、merge(spe, loc, all.x=TRUE, all.y=TRUE)代わりに使用します。

ステーションごとのすべての種の存在量のテーブルが必要です。これは、によって達成され、データフレームに変換されます

as.data.frame.matrix(xtabs(abundance ~ ID + species, merge(spe, loc, all.x=T)))
        Ensis ensis Magelona Nemertea Ophelia Spio
STA0001         100        5       17       0    0
STA0002           0        8        0    1200    0
STA0003          89        0        0     950    1

アンドリーとコットン氏に感謝

于 2012-07-16T09:27:10.950 に答える