如何使用 R 将长纬度数据帧转换为 xyz 数据帧?
How to convert a long lat data dataframe to a xyz dataframe using R?
我想将下面的数据框(dataset)转换成xyz格式,得到经度(x变量,第一行每列的前36个值),纬度(y变量,前30个值在第一列的每一行中)和每个 x-y 有序对(z 变量)的当前值。是否可以使用 r 来实现?
数据包含空间分布的降雨量值(大多数值等于或接近于零)。经度范围从-47.8到-36.2,纬度范围从-21.2到-7.2。
> dataset <- read.csv("rainfall_data.csv", header = FALSE, sep = ",")
> headTail(dataset)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
1 <NA> -47.8 -47.4 -47 -46.6 -46.2 -45.8 -45.4 -45 -44.6 -44.2 -43.8 -43.4 -43 -42.6 -42.2 -41.8 -41.4 -41 -40.6
2 -21.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 -20.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 -20.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
34 -8.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
35 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
36 -7.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
37 -7.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31
1 -40.2 -39.8 -39.4 -39 -38.6 -38.2 -37.8 -37.4 -37 -36.6 -36.2
2 0 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ...
34 0 0 0 0 0 0 0 0 0 0 0
35 0 0 0 0 0 0 0 0 0 0 0
36 0 0 0 0 0 0 0 0 0 0 0
37 0 0 0 0 0 0 0 0 0 0 0
可能的结果:
x y z
1 -47.8 -21.1 0
2 -47.4 -21.1 0
3 -47.0 -21.1 0
4 -46.6 -21.1 0
... ... ... ...
1077 -37.4 -7.2 0
1078 -37.0 -7.2 0
1079 -36.6 -7.2 0
1080 -36.2 -7.2 0
此处提供数据:https://drive.google.com/file/d/1IQqoV1WsrEXQoorZmuE4DEA8wzJkI3GL/view?usp=sharing
使用 base R,我们可以创建一个没有第一列和第一行的新数据框。然后,我们可以将它们分配为行名和列名(不包括 NA
)。然后,我转换为 matrix
以转换为 table
,然后转换为具有三列的数据框。
result <- df[-1, -1]
row.names(result) <- df[-1,1]
colnames(result) <- df[1,-1]
as.data.frame(as.table(as.matrix(result)))
根据您的 .csv
,我们可以使用 read.delim
将第一列指定为行名,将第一行指定为 header,然后我们添加 check.names = FALSE
,以便我们 return 正确的数字作为 header(如果你输入 TRUE
,那么它会在名称的开头附加一个 X.
)。
df <- read.delim(file = "~/Downloads/rainfall_data.csv", header = TRUE, row.names = 1, sep = ",", check.names=FALSE)
as.data.frame(as.table(as.matrix(df)))
另一种选择是使用 tibble::column_to_rownames
和 janitor::row_to_names
的组合将 V1
转换为行名,将第 1 行转换为列名。然后,按照与基础 R.
相同的步骤进行操作
library(tidyverse)
library(janitor)
results <- df %>%
tibble::column_to_rownames("V1") %>%
janitor::row_to_names(1) %>%
as.matrix() %>%
as.table() %>%
as.data.frame()
输出
head(results)
Var1 Var2 Freq
1 -21.2 -47.8 0
2 -20.8 -47.8 0
3 -20.4 -47.8 0
4 -21.2 -47.4 0
5 -20.8 -47.4 0
6 -20.4 -47.4 0
数据
df <- structure(list(V1 = c("<NA>", "-21.2", "-20.8", "-20.4"), V2 = c(-47.8,
0, 0, 0), V3 = c(-47.4, 0, 0, 0), V4 = c(-47L, 0L, 0L, 0L), V5 = c(-46.6,
0, 0, 0), V6 = c(-46.2, 0, 0, 0), V7 = c(-45.8, 0, 0, 0), V8 = c(-45.4,
0, 0, 0), V9 = c(-45L, 0L, 0L, 0L), V10 = c(-44.6, 0, 0, 0),
V11 = c(-44.2, 0, 0, 0), V12 = c(-43.8, 0, 0, 0), V13 = c(-43.4,
0, 0, 0), V14 = c(-43L, 0L, 0L, 0L), V15 = c(-42.6, 0, 0,
0), V16 = c(-42.2, 0, 0, 0), V17 = c(-41.8, 0, 0, 0), V18 = c(-41.4,
0, 0, 0), V19 = c(-41L, 0L, 0L, 0L), V20 = c(-40.6, 0, 0,
0)), class = "data.frame", row.names = c(NA, -4L))
请检查这个。
rainfall_file <- "path/to/csv/file"
dataset <- read.csv(rainfall_file)
library(tidyverse)
results <- dataset %>%
pivot_longer(cols = !X,names_to = "Variable", values_to = "Count", names_prefix = "X.", names_transform = list(Variable = as.double), values_drop_na = TRUE)
我想将下面的数据框(dataset)转换成xyz格式,得到经度(x变量,第一行每列的前36个值),纬度(y变量,前30个值在第一列的每一行中)和每个 x-y 有序对(z 变量)的当前值。是否可以使用 r 来实现?
数据包含空间分布的降雨量值(大多数值等于或接近于零)。经度范围从-47.8到-36.2,纬度范围从-21.2到-7.2。
> dataset <- read.csv("rainfall_data.csv", header = FALSE, sep = ",")
> headTail(dataset)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
1 <NA> -47.8 -47.4 -47 -46.6 -46.2 -45.8 -45.4 -45 -44.6 -44.2 -43.8 -43.4 -43 -42.6 -42.2 -41.8 -41.4 -41 -40.6
2 -21.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 -20.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 -20.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
34 -8.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
35 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
36 -7.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
37 -7.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31
1 -40.2 -39.8 -39.4 -39 -38.6 -38.2 -37.8 -37.4 -37 -36.6 -36.2
2 0 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ...
34 0 0 0 0 0 0 0 0 0 0 0
35 0 0 0 0 0 0 0 0 0 0 0
36 0 0 0 0 0 0 0 0 0 0 0
37 0 0 0 0 0 0 0 0 0 0 0
可能的结果:
x y z
1 -47.8 -21.1 0
2 -47.4 -21.1 0
3 -47.0 -21.1 0
4 -46.6 -21.1 0
... ... ... ...
1077 -37.4 -7.2 0
1078 -37.0 -7.2 0
1079 -36.6 -7.2 0
1080 -36.2 -7.2 0
此处提供数据:https://drive.google.com/file/d/1IQqoV1WsrEXQoorZmuE4DEA8wzJkI3GL/view?usp=sharing
使用 base R,我们可以创建一个没有第一列和第一行的新数据框。然后,我们可以将它们分配为行名和列名(不包括 NA
)。然后,我转换为 matrix
以转换为 table
,然后转换为具有三列的数据框。
result <- df[-1, -1]
row.names(result) <- df[-1,1]
colnames(result) <- df[1,-1]
as.data.frame(as.table(as.matrix(result)))
根据您的 .csv
,我们可以使用 read.delim
将第一列指定为行名,将第一行指定为 header,然后我们添加 check.names = FALSE
,以便我们 return 正确的数字作为 header(如果你输入 TRUE
,那么它会在名称的开头附加一个 X.
)。
df <- read.delim(file = "~/Downloads/rainfall_data.csv", header = TRUE, row.names = 1, sep = ",", check.names=FALSE)
as.data.frame(as.table(as.matrix(df)))
另一种选择是使用 tibble::column_to_rownames
和 janitor::row_to_names
的组合将 V1
转换为行名,将第 1 行转换为列名。然后,按照与基础 R.
library(tidyverse)
library(janitor)
results <- df %>%
tibble::column_to_rownames("V1") %>%
janitor::row_to_names(1) %>%
as.matrix() %>%
as.table() %>%
as.data.frame()
输出
head(results)
Var1 Var2 Freq
1 -21.2 -47.8 0
2 -20.8 -47.8 0
3 -20.4 -47.8 0
4 -21.2 -47.4 0
5 -20.8 -47.4 0
6 -20.4 -47.4 0
数据
df <- structure(list(V1 = c("<NA>", "-21.2", "-20.8", "-20.4"), V2 = c(-47.8,
0, 0, 0), V3 = c(-47.4, 0, 0, 0), V4 = c(-47L, 0L, 0L, 0L), V5 = c(-46.6,
0, 0, 0), V6 = c(-46.2, 0, 0, 0), V7 = c(-45.8, 0, 0, 0), V8 = c(-45.4,
0, 0, 0), V9 = c(-45L, 0L, 0L, 0L), V10 = c(-44.6, 0, 0, 0),
V11 = c(-44.2, 0, 0, 0), V12 = c(-43.8, 0, 0, 0), V13 = c(-43.4,
0, 0, 0), V14 = c(-43L, 0L, 0L, 0L), V15 = c(-42.6, 0, 0,
0), V16 = c(-42.2, 0, 0, 0), V17 = c(-41.8, 0, 0, 0), V18 = c(-41.4,
0, 0, 0), V19 = c(-41L, 0L, 0L, 0L), V20 = c(-40.6, 0, 0,
0)), class = "data.frame", row.names = c(NA, -4L))
请检查这个。
rainfall_file <- "path/to/csv/file"
dataset <- read.csv(rainfall_file)
library(tidyverse)
results <- dataset %>%
pivot_longer(cols = !X,names_to = "Variable", values_to = "Count", names_prefix = "X.", names_transform = list(Variable = as.double), values_drop_na = TRUE)