如何在不使用for循环的情况下排除数据帧的前两行并一次删除所有无数据列

时间:2019-03-09 08:37:08

标签: r dataframe

我有一个超过一百万列的数据框(我将栅格堆栈转换为一个数据框)。在这100万列中,只有数千列具有数据。 数据帧的前两行具有纬度和经度信息。如何删除没有数据的列,但是每一列都有数据作为纬度和经度信息。

示例:

> head(data[,c(1:8)])
            [,1]      [,2]      [,3]      [,4]      [,5]    [,6]      [,7]      [,8]
 x         -961887.6 -960959.8 -960032.1 -959104.4 -958176.7 -957249 -956321.2 -955393.5
 y         2816074.2 2816074.2 2816074.2 2816074.2 2816074.2 2816074 2816074.2 2816074.2
 X2012273.        NA        NA        NA        NA        NA      NA        NA        NA
 X2012281.        NA        NA        NA        NA        NA      NA        NA        NA
 X2012289.        NA        NA        NA        NA        NA      NA        NA        NA
 X2012297.        NA        NA        NA        NA        NA      NA        NA        NA

我的问题是如何排除前两行并立即删除所有无数据列。

我尝试了以下代码: dataframe(数据)中的行数为22,包括纬度行和经度行。我应用了逻辑:

for (i in 1:ncol(data)) {
    y = sum(is.na(data[,i]))
    if(y == (length(data[,i]) - 2)) {
        data[,-i]
    }
 }

此for循环可能需要很长时间,最终将无法成功执行。

1 个答案:

答案 0 :(得分:0)

根据我对您问题的理解,以下是可能的解决方案:

首先,出于可复制示例的目的,您的数据集:

dput(data)

structure(list(V1 = structure(c(1L, 6L, 2L, 3L, 4L, 5L), .Label = c("x", "X2012273",     "X2012281", "X2012289", "X2012297", "y"), class = "factor"), V2 = c(-961887.6, 2816074.2, NA, NA, NA, NA), V3 = c(-960959.8, 2816074.2, NA, NA, NA, NA), V4 = (-960032.1, 2816074.2, NA, NA, NA, NA), V5 = c(-959104.4, 2816074.2, NA, NA, NA, NA), V6 = c(-958176.7, 2816074.2, NA, NA, NA, NA), V7 = c(-957249L, 2816074L, NA, NA, NA, NA), V8 = c(-956321.2, 2816074.2, NA, NA, NA, NA), V9 = c(-955393.5, 2816074.2, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, -6L))

下一步,删除仅具有NA的所有列:

data2 = data[, colSums(is.na(data)) != nrow(data) - 2]

data2 是应满足您要求的最终数据框。在上面的代码中,它正在检查给定列中NA的总和是否等于其行数减去2,如果是,则删除此类列。

最终输出即 data2 如下所示:

data2
[1] x        y        X2012273 X2012281 X2012289 X2012297

如您所见,代表经度和纬度的x,y是输出的一部分,这就是您想要的。