我正在使用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
答案 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