使用 sp 定义坐标:关于缺失值的错误消息,但没有 NA 数据。为什么?

Define coordinates using sp: error message about missing values, but no NA data. Why?

我有带坐标的数据,没有缺失值。我想使用 sp 将它们定义为坐标,但用于数据的子集。当我使用

subset_of_data <- data[data$variable == x, ]
coordinates_from_data = subset(subset_of_data, select=c("S_X", "S_Y"))
coordinates(coordinates_from_data) <- c("S_X", "S_Y")

我得到:

Error in `coordinates<-`(`*tmp*`, value = c("S_X", "S_Y")) : 
coordinates are not allowed to contain missing values

但是我用subset的时候没有问题:

subset_of_data <- subset(data, data$variable == x)
coordinates_from_data = subset(subset_of_data, select=c("S_X", "S_Y"))
coordinates(coordinates_from_data) <- c("S_X", "S_Y")

我没有收到错误。

知道为什么会这样吗?

sp无关;这就是子集在 R 中的工作方式。让我们举个例子:

df <- data.frame(city = c("Paris", "Berlin", NA),
                 x_coordinate = c(48.8589507, 52.5069312, 50.8550625), 
                 y_coordinate = c(2.27702, 13.1445501, 4.3053501))
df
    city x_coordinate y_coordinate
1  Paris     48.85895      2.27702
2 Berlin     52.50693     13.14455
3   <NA>     50.85506      4.30535

如果我们将这个数据帧转换为坐标,它就可以工作,因为没有 NA:

coordinates(df) <- c("x_coordinate", "y_coordinate")

现在假设我们只想在坐标中变换 df 的一个子集,例如,只变换巴黎。如果我们这样做:

sub_df = df[df$city == "Paris", ]

我们得到:

    city x_coordinate y_coordinate
1  Paris     48.85895      2.27702
NA  <NA>           NA           NA

在这种情况下,转换为坐标不再有效,因为子集变量包含 NA 值,子集在坐标变量中创建 NA 值。

coordinates(sub_df) <- c("x_coordinate", "y_coordinate")
Error in `coordinates<-`(`*tmp*`, value = c("X_coordinate", "Y_coordinate" : 
  coordinates are not allowed to contain missing values

subset 的工作方式不同:

sub_df_2 = subset(df, df$city == "Paris")
sub_df_2
          coordinates  city
1 (48.85895, 2.27702) Paris

另一个选项是在使用[时更具体:

sub_df_3 = df[df$city == "Paris" & !is.na(df$city), ]
sub_df_3
          coordinates  city
1 (48.85895, 2.27702) Paris

对于 Python 用户

与Pandas有很大区别' [ operator:

import pandas as pd
import numpy as np

df = pd.DataFrame({'city': ['Paris', 'Berlin', np.NaN],
                   'x_coordinate': [48.8589507, 52.5069312, 50.8550625],
                   'y_coordinate': [2.27702, 13.1445501, 4.3053501]})

print(df[df["city"] == 'Paris'])

    city  x_coordinate  y_coordinate
0  Paris     48.858951       2.27702