如何删除列表中多个数据框中的空行

时间:2018-04-11 16:48:15

标签: r list dataframe

我有一个包含各种行号的24个数据帧的列表。其中一些行具有空值,即既不是NA也不是NULL,只是“”。这些行的数量在数据帧之间有所不同,但我想删除这些行。

示例数据框,但这几乎是列表中所有数据框的样子,有很多空值,还有一些我想保留的值。

>df <- data.frame(c("","","","A","","B","","","C"))
colnames(df) <- "sn"

> df
   sn
1   
2   
3   
4  A
5   
6  B
7   
8   
9  C

我尝试根据this pagethis page直接删除这些行,在省略这些行之前将NA添加到空行from this page,甚至{{1} } from here。这似乎都不起作用,因为列表中的任何数据帧都没有发生任何事情。我也试过了列表中的一个数据帧,就像这里显示的样本一样,但只有更多的行,但仍然没有变化。

在Stack Overflow上的各个页面中,这些是我试图解决的一些代码

1)test[complete.cases(df), ]

2)df <- lapply(df, function(x) sapply(df, nrow)>0)

3)lapply(df, function(x){ df[rowSums(is.na(df)) != ncol(df),]})

4)df[!apply(df == "", 1, all),]

5)df[rowSums(df=="")!=ncol(df), ]

6a)df[apply(df, 1, function(x) any(x != '')), ]

6b)df[df==""]<-NA

遗憾的是,所有这些尝试都没有对数据框执行任何操作,使其与上面列出的相同。

有什么建议吗?非常感谢你提前!

1 个答案:

答案 0 :(得分:0)

考虑这些尝试解决方案的组合。由于complete.cases()检查所有列中的NA,而空字符串值与NA不同,我们会重新分配值,然后运行completed.cases。调用data.frame()以下以避免由于单个列而导致向量返回(删除多个列的调用)。

df_list <- list(
     data.frame(sn=c("","","","A","","B","","","C")),
     data.frame(sn=c("","","","A","","B","","","C")),
     data.frame(sn=c("","","","A","","B","","","C"))
)

new_df_list <- lapply(df_list, function(df) {
  df[df == ""] <- NA
  data.frame(sn = df[complete.cases(df),])   
})

new_df_list
# [[1]]
#   sn
# 1  A
# 2  B
# 3  C

# [[2]]
#   sn
# 1  A
# 2  B
# 3  C

# [[3]]
#   sn
# 1  A
# 2  B
# 3  C