0

次のようにデータフレームをレイアウトしました。

Species Trait.p  Trait.y   Trait.z
   a      20.1    7.2        14.1
   b      20.4    8.3        15.2
   b      19.2    6.8        13.9

それぞれの種の組み合わせに対して、(Xa)-(Xb)を適用したいと思います。ここで、Xは特性値であり、文字は種であり、Xa>Xbです。つまり、すべての特性について計算された、それぞれの種の組み合わせの大きい方の値が最初に来るようにする必要があります

これは複数のステップからなるプロセスでしょうか?

出力例は次のようになります

Combination  Trait.p  Trait.y  Trait.z
    a/b        0.3      1.1      1.1
4

1 に答える 1

0

私はあなたが最大の価値を選ぶと仮定しました、しかしデビッドは良い点を持ち出します。これが最善のアプローチだとは思いませんが、あなたが求めているものが得られると思います。あなたの問題はaとbだけよりも少し複雑であると確信しているので、acを追加したことに注意してください。

dat <- read.table(text="Species Trait.p  Trait.y   Trait.z
   a      20.1    7.2        14.1
   b      20.4    8.3        15.2
   b      19.2    6.8        13.9
   c      14.2    3.8        11.9", header=T)

li <- lapply(split(dat, dat$Species), function(x) apply(x[, -1], 2, max))

com <- expand.grid(names(li), names(li))
inds <- com[com[, 1] != com[, 2], ]
inds <- t(apply(inds, 1, sort))
inds <- inds[!duplicated(inds), ]

ans <- lapply(1:nrow(inds), function(i) {
    abs(li[[inds[i, 1]]]-li[[inds[i, 2]]])
})
cbind(Combination = paste(inds[, 1], inds[, 2], sep="/"), 
    as.data.frame(do.call(rbind, ans)))

これは私たちに与えます:

  Combination Trait.p Trait.y Trait.z
1         a/b     0.3     1.1     1.1
2         a/c     5.9     3.4     2.2
3         b/c     6.2     4.5     3.3

注釈がないことをお詫びしますが、私はクラスに向かっています。

于 2012-08-30T19:33:58.640 に答える