如何使用R中的for循环从具有不同结构的多个数据帧中删除NA列?

时间:2015-11-17 10:51:46

标签: r excel

我在清理使用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列的过程,以获得上述维度各自的数据框架。

1 个答案:

答案 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