Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不使用for循环的情况下排除数据帧的前两行并同时删除所有无数据列_R_Dataframe - Fatal编程技术网

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

如何在不使用for循环的情况下排除数据帧的前两行并同时删除所有无数据列,r,dataframe,R,Dataframe,我有一个超过一百万列的数据框(我将光栅堆栈转换为数据框)。在这100万列中,只有数千列有数据。 数据帧的前两行具有纬度和经度信息。如何删除没有数据的列但是每列都有数据作为纬度和经度信息 样本: > head(data[,c(1:8)]) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] x -961887.6 -960959.8 -960032.1 -9

我有一个超过一百万列的数据框(我将光栅堆栈转换为数据框)。在这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
我的问题是如何一次排除前两行并删除所有无数据列

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

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

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

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

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

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))
接下来,要删除所有只有NAs的列:

data2 = data[, colSums(is.na(data)) != nrow(data) - 2]
data2是应满足您要求的最终数据帧。在上面的代码中,它检查给定列中NAs的总和是否等于其行数减去2,如果是,则删除这些列

最终输出,即数据2,如下所示:

data2
[1] x        y        X2012273 X2012281 X2012289 X2012297

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

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

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

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))
接下来,要删除所有只有NAs的列:

data2 = data[, colSums(is.na(data)) != nrow(data) - 2]
data2是应满足您要求的最终数据帧。在上面的代码中,它检查给定列中NAs的总和是否等于其行数减去2,如果是,则删除这些列

最终输出,即数据2,如下所示:

data2
[1] x        y        X2012273 X2012281 X2012289 X2012297

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

请提供样本数据我用样本数据更新了问题我不清楚。要删除哪些行?要删除哪些列?我只想删除没有数据值(NA)的列。但问题是,如果他们没有数据,但前两行仍有lat/long信息,请提供一个样本数据。我用样本数据更新了问题,但我不清楚。要删除哪些行?要删除哪些列?我只想删除没有数据值(NA)的列。但问题是,如果它们没有数据,但前两行中仍然有lat/long信息。