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))

我想为每个物种获得一个新的数据框,只列出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大于一的,这就是我卡住的地方。任何机构都可以帮助我完成我的循环吗?

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

与@Basterfield 的结果相同,但无需安装额外的软件包。

您要求的值大于 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

这是一个两条线......
它会生成一个名为的列表results,其中包含每个所需物种的一个 data.frame。
每个数据帧都是原始帧中相应行的子集Test,因此仅保留通过 >= 1.0 过滤器的列。

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 回答