【问题标题】:How to exclude first two rows of a dataframe and delete all no data columns at once without using for loop如何在不使用 for 循环的情况下排除数据框的前两行并一次删除所有无数据列
【发布时间】:2019-03-09 17:13:51
【问题描述】:

我有一个包含超过 100 万列的数据框(我将栅格堆栈转换为数据框)。在这 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

我的问题是如何排除前两行并一次删除所有没有数据的列。

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

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

这个for循环可能需要很长时间,最终不会成功执行。

【问题讨论】:

  • 请提供样本数据
  • 我用示例数据更新了问题
  • 我不清楚。您要删除哪些行?您要删除哪些列?
  • 我只想删除没有数据值 (NA) 的列。但问题是,如果他们没有数据,但在前两行中仍然有纬度/经度信息。

标签: r dataframe


【解决方案1】:

根据我对您问题的理解,这是一个可能的解决方案:

首先,您的数据集用于可重现的示例:

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 是输出的一部分,这正是您想要的。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2018-10-15
    • 2022-09-23
    • 2015-01-13
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2022-01-22
    相关资源
    最近更新 更多