我有一个包含各种行号的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 page或this 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
遗憾的是,所有这些尝试都没有对数据框执行任何操作,使其与上面列出的相同。
有什么建议吗?非常感谢你提前!
答案 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