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