如果其中一行中有 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
。我当前的 lapply
和 na.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 创建
我有一个 data.frames
大小相同的列表。每个 data.frame
的不同行和列中存在缺失数据。我想删除每个数据框的行,data.frames
之一的行包含 NaN
。我当前的 lapply
和 na.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 创建