如果其中一行中有 NA 值,则从列表中的所有数据框中删除一行

Remove a row from all dataframes in a list if NA value in one of the rows

我有一个 data.frames 大小相同的列表。每个 data.frame 的不同行和列中存在缺失数据。我想删除每个数据框的行,data.frames 之一的行包含 NaN。我当前的 lapplyna.omit 代码删除了对应于特定 data.frame 的每一行,这很有意义,因为它在移动到下一个之前遍历列表中的每个 data.frame一。但是,我想这样做,如果 NaN 存在于 data.frame 的一行中,则该行将从所有其他 data.frames

中删除

一些示例代码:

#Make list
ls <- list(x1=data.frame(a=c(1,2,3,4),b=c(2,3,4,5),c=c(3,4,NaN,6)),
           x2=data.frame(a=c(1,NaN,3,4),b=c(2,3,4,5),c=c(3,4,5,6)))
#Desired output
lscalc <- list(x1=data.frame(a=c(1,4),b=c(2,5),c=c(3,6)),
               x2=data.frame(a=c(1,4),b=c(2,5),c=c(3,6)))

假设所有数据集的行数相同,首先从所有数据集中获取 row 索引,然后遍历 list 并删除那些行

un1 <- unique(unlist(lapply(ls, function(x) which(is.na(x), arr.ind = TRUE)[,1])))
lapply(ls, function(x) x[!seq_len(nrow(x)) %in% un1, ])
$x1
  a b c
1 1 2 3
4 4 5 6

$x2
  a b c
1 1 2 3
4 4 5 6

这是一个使用 complete.cases() 的方法,但在其他方面与 @akrun 的相同。

#Make list
l <- list(x1=data.frame(a=c(1,2,3,4),b=c(2,3,4,5),c=c(3,4,NaN,6)),
           x2=data.frame(a=c(1,NaN,3,4),b=c(2,3,4,5),c=c(3,4,5,6)))
#Desired output
lcalc <- list(x1=data.frame(a=c(1,4),b=c(2,5),c=c(3,6)),
               x2=data.frame(a=c(1,4),b=c(2,5),c=c(3,6)))

inds <- lapply(l, \(x)which(!complete.cases(x)))
inds <- unique(do.call(c, inds))
lcalc2 <- lapply(l, \(x)x[-inds, ])
lcalc2
#> $x1
#>   a b c
#> 1 1 2 3
#> 4 4 5 6
#> 
#> $x2
#>   a b c
#> 1 1 2 3
#> 4 4 5 6

reprex package (v2.0.1)

于 2022-05-24 创建