删除多个 Dataframe 中所有NA值的列

pkmbmrz7  于 2023-02-14  发布在  其他
关注(0)|答案(3)|浏览(135)

我有超过100个 Dataframe 加载到R中,其中一些列包含100%缺失的数据,我想从所有 Dataframe 中删除这些数据。在下面的3个 Dataframe 示例中,我想删除列a,d,h,因为它们包含所有缺失的值,但保持所有 Dataframe 名称和其他所有内容相同。如何做到这一点?

df1 <- data.frame(`a` = rep(NA, 5), `b` = seq(1, 5, 1), `c` = letters[1:5])
df2 <- data.frame(`d` = rep(NA, 5), `e` = seq(2, 6, 1), `f` = letters[6:10])
df3 <- data.frame(`g` = rep(5, 5), `h` = rep(NA, 5), `i` = letters[6:10])
kninwzqo

kninwzqo1#

您可以将数据框放在列表中并使用匿名函数。

lst <- mget(ls(pattern='^df\\d$'))

lapply(lst, \(x) x[, !apply(is.na(x), 2, all)])
# $df1
#   b c
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 e
# 
# $df2
#   e f
# 1 2 f
# 2 3 g
# 3 4 h
# 4 5 i
# 5 6 j
# 
# $df3
#   g i
# 1 5 f
# 2 5 g
# 3 5 h
# 4 5 i
# 5 5 j
jk9hmnmh

jk9hmnmh2#

R - how to check if all rows in a dataframe are NaN?

library(purrr) 

map(mget(ls()), ~ .x[, colSums(is.na(.x)) < nrow(.x)])  

$df1
  b c
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e

$df2
  e f
1 2 f
2 3 g
3 4 h
4 5 i
5 6 j

$df3
  g i
1 5 f
2 5 g
3 5 h
4 5 i
5 5 j
w80xi6nr

w80xi6nr3#

我们可以使用tidyverse,首先把你所有的 Dataframe 放在一个列表中,然后用select循环遍历列表元素:

library(dplyr)
library(purrr)

my_df_list %>%
    map(\(x) select(x, where(~
!all(is.na(.x))))

要创建 Dataframe 列表,我们可以使用mget

my_df_list <- mget(ls()) %>%
    keep(is.data.frame)

相关问题