1

次のデータフレームがあります。

Test <- data.frame(Species = c("A","B","C","D"), 
       WB1=c(0.1,1.1,0.9,1.2), 
       WB2=c(1, 0.8, 1.3, 1),
       WB3=c(0.5, 0.7, 1.2, 0.9),
       WB4=c(1.3, 1.2, 0.9, 0.6))

そして、1より大きいもののみをリストする種ごとの新しいデータフレームを取得したいと思いますWB's。したがって、この種の例でAは、

WB1 WB4
1.0 1.3

私は次のことを試しました:

AllSpecies <- Test$Species
AllWaterbodies <- colnames(Test)
for(species in AllSpecies)
{ 
  ind <- which(Test$Species == species)
  x <- Test[ind,]
  colnames(x) <- AllWaterbodies

と言うならspecies <- "A"、これはすでに私に与えるでしょう:

  Species WB1 WB2 WB3  NA
1       A 0.1   1 0.5 1.3

WB'sここで、1 より大きいものだけをリストしたいと思います。ループを完成させるのを手伝ってくれる人はいますか?

4

3 に答える 3

3

を使用した R ベース ソリューションlapply:

 lapply(split(Test[,-1], Test$Species), function(x) x[which(x>1)])
$A
  WB4
1 1.3

$B
  WB1 WB4
2 1.1 1.2

$C
  WB2 WB3
3 1.3 1.2

$D
  WB1
4 1.2

@Beasterfield と同じ結果ですが、追加のパッケージをインストールする必要はありません。

1 より大きい値を要求していますが、目的の出力では 1 以上の値が表示されるため、探しているコードは次のようになります。

lapply(split(Test[,-1], Test$Species), function(x) x[which(x>=1)])
$A
  WB2 WB4
1   1 1.3

$B
  WB1 WB4
2 1.1 1.2

$C
  WB2 WB3
3 1.3 1.2

$D
  WB1 WB2
4 1.2   1
于 2012-11-07T13:58:51.887 に答える
2

それはあなたが望むものですか?

library("plyr")
dlply( Test, "Species", function(x){
  x[ ,c( F, x[,2:5] > 1), drop = FALSE ]
})

出力:

$A
  WB4
1 1.3

$B
  WB1 WB4
2 1.1 1.2

$C
  WB2 WB3
3 1.3 1.2

$D
  WB1
4 1.2
于 2012-11-07T13:36:17.477 に答える
1

ここに 2 つのライナーがあります...これは、目的の種ごとに 1 つの data.frame を含む
という名前のリストを生成します。 各データフレームは、元のフレームである の対応する行のサブセットであり、>= 1.0 フィルターを通過する列のみが保持されます。results
Test

results <- list()
for (spc in c('A', 'B', 'C', 'D')) 
   results[[spc]] <- Test[Test$Species==spc, 
                          c( TRUE, Test[Test$Species==spc, -1] >= 1.0)]

> results
$A
  Species WB2 WB4
1       A   1 1.3
$B
  Species WB1 WB4
2       B 1.1 1.2
$C
  Species WB2 WB3
3       C 1.3 1.2
$D
  Species WB1 WB2
4       D 1.2   1

もちろん、すべての種を取得しfor (spc in Test[, "Species"])たい場合は、明示的なリストではなく使用できます。 また、スニペットを微調整して、リストの要素により洗練された名前を付けたり、個々の data.frames から Species 列を除外したりできます。例えば。

> results <- list()
> for (spc in c('A', 'C')) 
     results[[paste("Record for Species", spc)]] <-
            Test[Test$Species==spc, 
                 c(FALSE , Test[Test$Species==spc, -1] >= 1.0)]
> results
$`Record for Species A`
  WB2 WB4
1   1 1.3

$`Record for Species C`
  WB2 WB3
3 1.3 1.2
于 2012-11-07T15:08:41.570 に答える