3

サンプルポイントのグループを含むデータフレームがあります。

samplePoint<-c("1","1","1","1","2","2","2","2","3","3","3","3")
category<-c("a", "a", "a", NA, "b", "b", NA, "b", NA, "a", "a", "a")
values<-c(0.51, 0.21, 0.31, 0.22, 0.61, 0.71, 0.52, 0.32, 0.23, 0.1, 0.24, 0.33)
dat<-data.frame(samplePoint, category, values)

プロセスの後半で何かを行うために、dat$categoryのNAを再コーディングする必要があります。各サンプルポイントには、カテゴリが1つだけあります。1つはすべて「a」、2は「b」、3つは「a」である必要があります。

一致またはルックアップタイプの関数を使用して再コーディングすることを目的として、ifelse関数を使用して集計を試みました。

codeList<-aggregate(
dat$category, by=list(dat$samplePoint),
FUN=function(x){ifelse(length(which(x=="a")) > length(which(x=="b")), "a", "b")}
)

質問1は、どのようにマッチングに取り組むのですか?質問2は、全体を完全に複雑にしすぎたのでしょうか。

ご協力いただきありがとうございます。

4

1 に答える 1

1

Q1: そうではありません。なぜなら、 Q2: はい、大規模です。

できることはfactor、適切に変換され、必要なラベルを付けたサンプル ポイントで call を使用することです。

category <- factor((as.numeric(samplePoint)+1)%%2,labels=letters[1:2])
category
 [1] a a a a b b b b a a a a
Levels: a b

変換では、モジュラス演算子 (%%) を使用してサンプル ポイントをバイナリ出力に変換しますが、ポイント 1 と 3 が label に対応するようにポイントがシフトされ"a"ます。それ以降のポイントも同様に、4: "b"、5: "a" のようにコード化されます。

アップデート

コメントで説明を受けた後、これが役立つと思います:

(catTable <- aggregate(category,list(samplePoint=samplePoint),function(x) unique(x[!is.na(x)])))
  samplePoint x
1           1 a
2           2 b
3           3 a

mergeこれにより、元のデータを使用して必要なものを取得できる data.frame が得られます。

merge(dat,catTable,all.x=T)
   samplePoint category values x
1            1        a   0.51 a
2            1        a   0.21 a
3            1        a   0.31 a
4            1     <NA>   0.22 a
5            2        b   0.61 b
6            2        b   0.71 b
7            2     <NA>   0.52 b
8            2        b   0.32 b
9            3     <NA>   0.23 a
10           3        a   0.10 a
11           3        a   0.24 a
12           3        a   0.33 a
于 2012-11-01T12:05:28.063 に答える