如何从循环后的多个列中选择一个行值?

时间:2014-08-11 21:58:37

标签: r loops min which

我在我的" info"数据帧:

                   sci wd.sps1 wd.sps2 wd.genus wd.family
1    Acacia polyphylla  0.6185  0.6185   0.6335      0.69
2    Acacia polyphylla  0.6185  0.6185   0.6335      0.69
3    Acacia polyphylla  0.6185  0.6185   0.6335      0.69
4    Acacia polyphylla  0.6185  0.6185   0.6335      0.69
5      Acosmium nitens  0.8200  0.8200   0.8100      0.69
6      Acosmium nitens  0.8200  0.8200   0.8100      0.69
7           Aiouea sp.      NA      NA   0.3700      0.55
8           Aiouea sp.      NA      NA   0.3700      0.55
9  Allophylus robustus      NA      NA   0.3900      0.73
10 Allophylus robustus      NA      NA   0.3900      0.73

我想出了这个循环来获得数据帧中出现的第一个wd .____值(即第1行应该为0.6185,第7行为0.3700,第10行为0.3900):

for (i in 1:nrow(info)) {
    if( all( is.na (info[i,c("wd.sps1","wd.sps2", "wd.genus", "wd.family")]))) {
        next()   
    }   
    info[i,]$wd = with(info[i,], c(wd.sps1, wd.sps2, wd.genus, 
      wd.family)[min( which( !is.na( c(wd.sps1, wd.sps2, wd.genus, wd.family))))]
    ) 
}

我使用了一个具有不同数据帧的类似循环,但它确实有效,但这次我一直收到一个我不明白的错误...

2 个答案:

答案 0 :(得分:0)

利用apply()

的方法
info$wd <- apply(info[,c("wd.sps1","wd.sps2", "wd.genus","wd.family")],
                 1,function(x)na.omit(x)[1])

我确信它可以更有效地完成,但这是我想到的第一件事。

答案 1 :(得分:0)

此外,

indx <- which(!is.na(info[,-1]),arr.ind=T)
info$wd <- info[,-1][indx[!duplicated(indx[,1]),]]
info$wd
#[1] 0.6185 0.6185 0.6185 0.6185 0.8200 0.8200 0.3700 0.3700 0.3900 0.3900