R 删除数据帧列表中的NA列

R 删除数据帧列表中的NA列,r,plyr,R,Plyr,使用readxl清理从Excel导入的数据时遇到问题readxl创建了一个包含class=c('data.frame',tbl_df,tbl)的大型对象列表(我还想知道为什么/如何为其分配多个类)。每个对象都是原始Excel工作簿中的一张工作表。问题是,这些对象(图纸)中的每一个都可能有许多列完全由NAs填充。我扫描了stackoverflow,发现了一些类似的问题,并尝试应用给定的解决方案,如和(第一个是最像我的问题)。但是,当我尝试这一点时: lapply(x, function(y) y[

使用
readxl
清理从Excel导入的数据时遇到问题
readxl
创建了一个包含class=
c('data.frame',tbl_df,tbl)
的大型对象列表(我还想知道为什么/如何为其分配多个类)。每个对象都是原始Excel工作簿中的一张工作表。问题是,这些对象(图纸)中的每一个都可能有许多列完全由NAs填充。我扫描了stackoverflow,发现了一些类似的问题,并尝试应用给定的解决方案,如和(第一个是最像我的问题)。但是,当我尝试这一点时:

lapply(x, function(y) y[, !is.na(y)])
我得到以下错误:

Error in `[.data.frame`(y, , !is.na(y)) : undefined columns selected
我也试过:

lapply(x, function(y) y[!is.na(y)]
但它将我所有的数据帧减少到只有第一列。我想我知道这与列表语法中的数据帧有关。我尝试了不同的
y[[]][]
迭代,甚至最近在
lappy
中发现了这个有趣的模式:
lappy(x,[[],y)
,但无法使它工作

以下是我的数据帧列表中的前两个对象(也感谢您提供有关如何在
dput
-ing此数据中更高效的任何提示)。如您所见,第一个对象没有NA列,而第二个对象有5个NA列。我想删除这5个NA列,但对我列表中的所有对象都这样做

非常感谢您的帮助

dput(head(x[[1]]))
structure(list(Date = structure(c(1305504000, 1305504000, 1305504000, 
1305504000, 1305504000, 1305504000), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), Time = structure(c(-2209121912, -2209121612, 
-2209121312, -2209121012, -2209120712, -2209120412), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), Level = c(106.9038, 106.9059, 106.89, 
106.9121, 106.8522, 106.8813), Temperature = c(6.176, 6.173, 
6.172, 6.168, 6.166, 6.165)), .Names = c("Date", "Time", "Level", 
"Temperature"), row.names = c(NA, 6L), class = c("tbl_df", "tbl", 
"data.frame"))

dput(head(x[[2]]))
structure(list(Date = structure(c(1305504000, 1305504000, 1305504000, 
1305504000, 1305504000, 1305504000), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), Time = structure(c(-2209121988, -2209121688, 
-2209121388, -2209121088, -2209120788, -2209120488), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), LEVEL = c(117.5149, 117.511, 117.5031, 
117.5272, 117.4523, 117.4524), TEMPERATURE = c(5.661, 5.651, 
5.645, 5.644, 5.644, 5.645), `NA` = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_), `NA` = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_), `NA` = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_), `NA` = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_), `NA` = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_)), .Names = c("Date", "Time", "LEVEL", 
"TEMPERATURE", NA, NA, NA, NA, NA), row.names = c(NA, 6L), class =    
c("tbl_df", "tbl", "data.frame"))
这个怎么样:

lapply(df_list, function(df) df[, colSums(is.na(df)) == 0])
或者可能:

lapply(df_list, function(df) df[, colSums(is.na(df)) < nrow(df)])
lappy(df_列表,函数(df)df[,colSums(is.na(df))

如果你想让一些行,但不是所有的行都是NA,那就非常好了。谢谢!你为什么认为
lappy(x,function(y)y[,!is.NA(y)])
不起作用,因为它的形式似乎非常相似?@user2943039比较
!is.NA(df)
colSums(is.NA(df))的输出在列表中的一个DATA框架中尝试和理解差异。您需要一个真值/假值向量来确定要保留哪些列。请考虑将答案标记为正确。