通过列内容子集数据框

时间:2012-11-07 13:07:25

标签: r list dataframe subset

我有以下数据框:

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, 这就是我被困住的地方。 任何人都可以帮助我完成循环吗?

3 个答案:

答案 0 :(得分:3)

使用lapply的R基础解决方案:

 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

答案 1 :(得分: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

答案 2 :(得分:1)

这是一个双线... ... 它生成一个名为results的列表,其中包含每个所需物种的一个data.frame 每个数据框都是Test(原始框架)中相应行的子集,因此只保留通过&gt; = 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