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