删除数据框列表中的NA列

时间:2015-10-29 16:04:17

标签: r plyr

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

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[[]][]的不同迭代,甚至最近在lapplylapply(x, "[[", y)中找到了这个有趣的模式,但无法使其发挥作用。

以下是我的数据框列表中的前两个对象(关于如何在dput中提高效率的任何提示 - 这些数据也很受欢迎)。如您所见,第一个对象没有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"))

1 个答案:

答案 0 :(得分:1)

这个怎么样:

lapply(df_list, function(df) df[, colSums(is.na(df)) == 0])

或者也许:

lapply(df_list, function(df) df[, colSums(is.na(df)) < nrow(df)])

如果你想允许一些但不是所有的行都是NA