我在清理使用readxl从Excel导入的数据时遇到了一些问题。我能够读取每个excel文件并将该文件中包含的单个工作表存储到单独的数据框中。
问题是这些创建的数据框中的每一个都有很多完全填充了NA的列,这是因为我的代码将这些表存储到一个列表中,我从中创建了单独的数据帧,因此这些NA列将作为结果该Excel文件中包含的所有列的联合。
我希望使用for循环自动执行从具有不同行数和列数的所有数据帧中删除所有NA列的过程。但是当我尝试这个时:
for(i in 1:length(AllFileSheetnames)){
assign(AllFileSheetnames[i], function(x) x[, colSums(is.na(x)) < nrow(x)])
print(AllFileSheetnames[i])
}
使用所有列的并集再次将所有值放入列表中。
我从R中的excel文件导入了5张纸。所有纸张都存储在数据框D1,D2,D3,D4和D5中。原始表格的详细信息如下:
D1:99行* 150列;
D2:99行* 166列;
D3:99行* 77列;
D4:99行* 8列;
D5:99行* 7列
当我使用readxl导入此文件时,它会创建一个包含495行和247个奇数列的列表。我成功地将列表拆分为D1,D2等单独的数据帧,但每个数据帧有247列,现在我希望自动执行从每个数据帧中删除NA列的过程,以获得上述维度各自的数据框架。
答案 0 :(得分:0)
您可能想尝试这个
## create two example data.frames (= reproducible example):
DF2 <- data.frame(x=1:3, y=c(1:2, NA), z=NA)
(DF1 <- data.frame(x=1:3, y=NA, z=c(1:2, NA)) )
# x y z
# 1 1 NA 1
# 2 2 NA 2
# 3 3 NA NA
## get objects named DFx and keep only cols,
## where not *all* values are missing values (NA):
res <- lapply(mget(paste0("DF", 1:2)),
function(DF)
DF[!sapply(DF, function(x) all(is.na(x)))]
)
## exploded the res-list into separate variables again:
invisible(list2env(res, globalenv())) # overwrites original DFs
## Inspect result: col y vanished in DF1
DF1
# x z
# 1 1 1
# 2 2 2
# 3 3 NA