1

私は 40 組の鳥を飼っており、それぞれのオスとメスが色で採点されています。カラー スコアは、カテゴリ変数 (1 ~ 9 の範囲) です。男性と女性のペアの色の組み合わせの数の頻度をプロットしたいと思います。各組み合わせの数 (1/1、1/2、1/3、... 9/7、9/8、9/9) の「テーブル」を作成し、それを次のベクトルに変換する必要があります。 「Color_Count」。「プロット」の「cex」パラメーターに「Colour_Count」を使用して、色の各組み合わせのサイズをスケーリングしたいと思います。これは、データがテーブルから読み取られる順序のため、機能しません。プロット ポイントをスケーリングするために、各色の組み合わせの頻度でベクトルを作成するにはどうすればよいですか?

以下のデータとコードを参照してください。

## Dataset pairs of males and females and their colour classes
Pair_Colours <- structure(list(Male = c(7, 6, 4, 6, 8, 8, 5, 6, 6, 8, 6, 6, 5, 
7, 9, 5, 8, 7, 5, 5, 4, 6, 7, 7, 3, 6, 5, 4, 7, 4, 3, 9, 4, 4, 
4, 4, 9, 6, 6, 6), Female = c(9, 8, 8, 9, 3, 6, 8, 5, 8, 9, 7, 
3, 6, 5, 8, 9, 7, 3, 6, 4, 4, 4, 8, 8, 6, 7, 4, 2, 8, 9, 5, 6, 
8, 8, 4, 4, 5, 9, 7, 8)), .Names = c("Male", "Female"), class = "data.frame", row.names = c(NA, 
40L))

Pair_Colours[] <- as.data.frame(lapply(Pair_Colours, factor, levels=1:9))

## table of pair colour values (colours 1 to 9 - categoricial variable)
table(Pair_Colours$Male, Pair_Colours$Female)

Colour_Count <-  as.vector(table(Pair_Colours$Male, Pair_Colours$Female)) #<- the problem occurs here

## plot results to visisually look for possible assortative mating by colour
op<-par(mfrow=c(1,1), oma=c(2,4,0,0), mar=c(4,5,1,2), pty = "s")
plot(1,1, xlim = c(1, 9), ylim = c(1, 9), type="n", xaxt = "n", yaxt = "n", las=1, bty="n", cex.lab = 1.75, cex.axis = 1.5, main = NULL, xlab = "Male Colour", ylab = "Female Colour", pty = "s")
axis(1, at = seq(1, 9, by = 1), labels = T, cex.lab = 1.5, cex.axis = 1.5, tick = TRUE, tck = -0.015, lwd = 1.25, lwd.ticks = 1.25)
axis(2, at = seq(1, 9, by = 1), labels = T, cex.lab = 1.5, cex.axis = 1.5, tick = TRUE, tck = -0.015, lwd = 1.25, lwd.ticks = 1.25, las =2)
points(Pair_Colours$Male, Pair_Colours$Female, pch = 21, cex = Colour_Count, bg = "darkgray", col = "black", lwd = 1)
4

1 に答える 1

4

ライブラリ plyr の機能ddply()を使用してデータを要約し、この新しいデータ フレームを使用してデータをプロットできます。カウントはV1新しいデータ フレームの列にあります。

library(plyr)
df<-ddply(Pair_Colours,.(Male,Female),nrow)
df
   Male Female V1
1     3      5  1
2     3      6  1
3     4      2  1
4     4      4  3

points(df$Male, df$Female, pch = 21, cex = df$V1, 
               bg = "darkgray", col = "black", lwd = 1)

UPDATE - 集計を使用したソリューション

他の可能性は function を使用することaggregate()です。最初に、値 1 のみを含む新しい列Nを追加します。次に、それぞれのaggregate()合計NMaleFemale組み合わせを使用します。

Pair_Colours$N<-1
aggregate(N~Male+Female,data=Pair_Colours,FUN=sum)

   Male Female N
1     4      2 1
2     6      3 1
3     7      3 1
4     8      3 1
5     4      4 3

ここに画像の説明を入力

于 2013-05-04T15:28:25.573 に答える