未分裂的data.frame,条件为R

时间:2014-11-12 17:40:33

标签: r

我正在使用unsplit将data.frame列表转换回data.frame;

列表我遇到问题:

$m3
    model1  model2   model3   Output Model
 3  0.13    0.113    0.18     0.4     m4
 4  0.157   0.11     0.21     0.50    m4
 5  0.058   0.03     0.18     0.46    m4

$m2
    model1    model2 model3 Output  Model
 1  0.200    0.099     NA     NA      m3
 2  0.356    0.25      NA     NA      m3

$m1
    model1      model2   model3  Output Model
 1     0.200    0.099     0.3     0.9    m1
 2     0.35     0.252     0.4     0.9    m1

to unsplit我使用这种方法:

unsplit(x,c(3,3,1,1,1))

目的是获取$m3$m1而不是$m3$m2。它似乎只需要 它按顺序排列。因此,如果Output不是NA,我想从列表中提取(取消列表)。 我怎样才能做到这一点?

有关示例数据和相关问题,请参阅:here

编辑:期望的输出:

    model1  model2   model3   Output Model
 1  0.200   0.099    0.3      0.9     m1      # and not m3 from $m2
 2  0.35    0.252    0.4      0.9     m1      # and not m3 from $m2
 3  0.13    0.113    0.18     0.4     m4
 4  0.157   0.11     0.21     0.50    m4
 5  0.058   0.03     0.18     0.46    m4

2 个答案:

答案 0 :(得分:3)

这适用于您l列表的位置:

do.call(rbind, lapply(l, FUN=function(x) if(!any(is.na(x$Output))){x}))

可重复的例子:

m3 <- read.table(header=T, text='
                     model1  model2   model3   Output Model
   0.13    0.113    0.18     0.4     m4
   0.157   0.11     0.21     0.50    m4
   0.058   0.03     0.18     0.46    m4
                 ')

m2 <- read.table(header=T, text='
       model1    model2 model3 Output  Model
 0.200    0.099     NA     NA      m3
 0.356    0.25      NA     NA      m3
                 ')


m1 <- read.table(header=T, text='
                     model1  model2   model3   Output Model
 0.200    0.099     0.3     0.9    m1
 0.35     0.252     0.4     0.9    m1
                 ')

l <- list(m3=m3, m2=m2, m1=m1)

do.call(rbind, lapply(l, FUN=function(x) if(!any(is.na(x$Output))){x}))
> do.call(rbind, lapply(l, FUN=function(x) if(!any(is.na(x$Output))){x}))
     model1 model2 model3 Output Model
m3.1  0.130  0.113   0.18   0.40    m4
m3.2  0.157  0.110   0.21   0.50    m4
m3.3  0.058  0.030   0.18   0.46    m4
m1.1  0.200  0.099   0.30   0.90    m1
m1.2  0.350  0.252   0.40   0.90    m1

答案 1 :(得分:3)

我会使用data.table非常高效的rbindlist函数和complete.cases

来对整个事物进行矢量化

假设来自@cdetermans的l回答

library(data.table)
l <- rbindlist(l)
l[complete.cases(l), ] 
#    model1 model2 model3 Output Model
# 1:  0.130  0.113   0.18   0.40    m4
# 2:  0.157  0.110   0.21   0.50    m4
# 3:  0.058  0.030   0.18   0.46    m4
# 4:  0.200  0.099   0.30   0.90    m1
# 5:  0.350  0.252   0.40   0.90    m1