如何在 R 中转置或旋转日期框架的列
How to transpose or pivot columns of a date frame in R
我正在尝试转置 R 中的数据。
检索到的数据是一个 JSON 文件,这是我正在使用的数据框的示例:
date parameter value
2020-07-01T23:50:00Z wind_dir 236.0
2020-07-01T23:40:00Z wind_dir 236.0
2020-07-01T23:40:00Z wind_speed 1.9
2020-07-01T23:30:00Z wind_dir 239.0
2020-07-01T23:10:00Z wind_dir 184.0
2020-07-01T23:00:00Z wind_dir 178.0
2020-07-01T22:50:00Z wind_speed 1.1
2020-07-01T22:50:00Z wind_dir 197.0
2020-07-01T22:40:00Z wind_speed 1.8
2020-07-01T22:30:00Z wind_speed 1.4
2020-07-01T22:20:00Z wind_dir 172.0
2020-07-01T22:20:00Z wind_speed 1.4
2020-07-01T22:00:00Z wind_dir 170.0
- 我需要更改日期,所以它不包括 T 和 Z.
- 我想转置行并将参数分成两列:wind_speed 和 wind_dir
最终数据集应如下所示:
date wind_dir wind_speed
2020-07-01 23:50:00 236.0 NA
2020-07-01 23:40:00 236.0 1.9
2020-07-01 23:30:00 239.0 NA
2020-07-01 23:10:00 184.0 NA
2020-07-01 23:00:00 178.0 NA
2020-07-01 22:50:00 197.0 1.1
2020-07-01 22:40:00 NA 1.8
2020-07-01 22:30:00 NA 1.4
2020-07-01 22:20:00 172.0 1.4
2020-07-01 22:00:00 170.0 NA
- 我也希望日期以递增的时间戳开头。
感谢您的帮助!
你可以试试
library(dplyr)
df %>%
mutate(date =gsub("T|Z", " ", date)) %>%
pivot_wider(names_from = parameter, values_from = value)
date wind_dir wind_speed
<chr> <dbl> <dbl>
1 "2020-07-01 23:50:00 " 236 NA
2 "2020-07-01 23:40:00 " 236 1.9
3 "2020-07-01 23:30:00 " 239 NA
4 "2020-07-01 23:10:00 " 184 NA
5 "2020-07-01 23:00:00 " 178 NA
6 "2020-07-01 22:50:00 " 197 1.1
7 "2020-07-01 22:40:00 " NA 1.8
8 "2020-07-01 22:30:00 " NA 1.4
9 "2020-07-01 22:20:00 " 172 1.4
10 "2020-07-01 22:00:00 " 170 NA
您可以使用 tidyr
包中的 pivot_wider
和 pivot_longer
函数。 T
和 Z
是 ISO 8601 的一部分,因此您可以轻松地将它们转换为 class 日期时间的对象:
library(tidyverse)
data <- tribble(
~date, ~parameter, ~value,
"2020-07-01T23:50:00Z ", "wind_dir", 236.0,
"2020-07-01T23:40:00Z " , "wind_dir", 236.0,
"2020-07-01T23:40:00Z" , "wind_speed", 1.9
)
data
#> # A tibble: 3 x 3
#> date parameter value
#> <chr> <chr> <dbl>
#> 1 "2020-07-01T23:50:00Z " wind_dir 236
#> 2 "2020-07-01T23:40:00Z " wind_dir 236
#> 3 "2020-07-01T23:40:00Z" wind_speed 1.9
data %>%
mutate(date = date %>% parse_datetime()) %>%
pivot_wider(names_from = parameter, values_from = value)
#> # A tibble: 2 x 3
#> date wind_dir wind_speed
#> <dttm> <dbl> <dbl>
#> 1 2020-07-01 23:50:00 236 NA
#> 2 2020-07-01 23:40:00 236 1.9
由 reprex package (v2.0.1)
于 2021-10-18 创建
T
和 Z
删除可以使用基 R gsub()
完成。其余的可以使用 tidyr 包中的 pivot_wider()
来完成:
raw <- read.table(text = "date parameter value
2020-07-01T23:50:00Z wind_dir 236.0
2020-07-01T23:40:00Z wind_dir 236.0
2020-07-01T23:40:00Z wind_speed 1.9
2020-07-01T23:30:00Z wind_dir 239.0
2020-07-01T23:10:00Z wind_dir 184.0
2020-07-01T23:00:00Z wind_dir 178.0
2020-07-01T22:50:00Z wind_speed 1.1
2020-07-01T22:50:00Z wind_dir 197.0
2020-07-01T22:40:00Z wind_speed 1.8
2020-07-01T22:30:00Z wind_speed 1.4
2020-07-01T22:20:00Z wind_dir 172.0
2020-07-01T22:20:00Z wind_speed 1.4
2020-07-01T22:00:00Z wind_dir 170.0", header = TRUE)
raw$date <- trimws(gsub("[TZ]", " ", raw$date))
library(tidyr)
packageVersion("tidyr")
#> [1] '1.1.2'
raw <- pivot_wider(raw,
names_from = "parameter",
values_from = "value")
raw
#> # A tibble: 10 x 3
#> date wind_dir wind_speed
#> <chr> <dbl> <dbl>
#> 1 2020-07-01 23:50:00 236 NA
#> 2 2020-07-01 23:40:00 236 1.9
#> 3 2020-07-01 23:30:00 239 NA
#> 4 2020-07-01 23:10:00 184 NA
#> 5 2020-07-01 23:00:00 178 NA
#> 6 2020-07-01 22:50:00 197 1.1
#> 7 2020-07-01 22:40:00 NA 1.8
#> 8 2020-07-01 22:30:00 NA 1.4
#> 9 2020-07-01 22:20:00 172 1.4
#> 10 2020-07-01 22:00:00 170 NA
由 reprex package (v2.0.0)
于 2021-10-18 创建
我正在尝试转置 R 中的数据。 检索到的数据是一个 JSON 文件,这是我正在使用的数据框的示例:
date parameter value
2020-07-01T23:50:00Z wind_dir 236.0
2020-07-01T23:40:00Z wind_dir 236.0
2020-07-01T23:40:00Z wind_speed 1.9
2020-07-01T23:30:00Z wind_dir 239.0
2020-07-01T23:10:00Z wind_dir 184.0
2020-07-01T23:00:00Z wind_dir 178.0
2020-07-01T22:50:00Z wind_speed 1.1
2020-07-01T22:50:00Z wind_dir 197.0
2020-07-01T22:40:00Z wind_speed 1.8
2020-07-01T22:30:00Z wind_speed 1.4
2020-07-01T22:20:00Z wind_dir 172.0
2020-07-01T22:20:00Z wind_speed 1.4
2020-07-01T22:00:00Z wind_dir 170.0
- 我需要更改日期,所以它不包括 T 和 Z.
- 我想转置行并将参数分成两列:wind_speed 和 wind_dir
最终数据集应如下所示:
date wind_dir wind_speed
2020-07-01 23:50:00 236.0 NA
2020-07-01 23:40:00 236.0 1.9
2020-07-01 23:30:00 239.0 NA
2020-07-01 23:10:00 184.0 NA
2020-07-01 23:00:00 178.0 NA
2020-07-01 22:50:00 197.0 1.1
2020-07-01 22:40:00 NA 1.8
2020-07-01 22:30:00 NA 1.4
2020-07-01 22:20:00 172.0 1.4
2020-07-01 22:00:00 170.0 NA
- 我也希望日期以递增的时间戳开头。
感谢您的帮助!
你可以试试
library(dplyr)
df %>%
mutate(date =gsub("T|Z", " ", date)) %>%
pivot_wider(names_from = parameter, values_from = value)
date wind_dir wind_speed
<chr> <dbl> <dbl>
1 "2020-07-01 23:50:00 " 236 NA
2 "2020-07-01 23:40:00 " 236 1.9
3 "2020-07-01 23:30:00 " 239 NA
4 "2020-07-01 23:10:00 " 184 NA
5 "2020-07-01 23:00:00 " 178 NA
6 "2020-07-01 22:50:00 " 197 1.1
7 "2020-07-01 22:40:00 " NA 1.8
8 "2020-07-01 22:30:00 " NA 1.4
9 "2020-07-01 22:20:00 " 172 1.4
10 "2020-07-01 22:00:00 " 170 NA
您可以使用 tidyr
包中的 pivot_wider
和 pivot_longer
函数。 T
和 Z
是 ISO 8601 的一部分,因此您可以轻松地将它们转换为 class 日期时间的对象:
library(tidyverse)
data <- tribble(
~date, ~parameter, ~value,
"2020-07-01T23:50:00Z ", "wind_dir", 236.0,
"2020-07-01T23:40:00Z " , "wind_dir", 236.0,
"2020-07-01T23:40:00Z" , "wind_speed", 1.9
)
data
#> # A tibble: 3 x 3
#> date parameter value
#> <chr> <chr> <dbl>
#> 1 "2020-07-01T23:50:00Z " wind_dir 236
#> 2 "2020-07-01T23:40:00Z " wind_dir 236
#> 3 "2020-07-01T23:40:00Z" wind_speed 1.9
data %>%
mutate(date = date %>% parse_datetime()) %>%
pivot_wider(names_from = parameter, values_from = value)
#> # A tibble: 2 x 3
#> date wind_dir wind_speed
#> <dttm> <dbl> <dbl>
#> 1 2020-07-01 23:50:00 236 NA
#> 2 2020-07-01 23:40:00 236 1.9
由 reprex package (v2.0.1)
于 2021-10-18 创建T
和 Z
删除可以使用基 R gsub()
完成。其余的可以使用 tidyr 包中的 pivot_wider()
来完成:
raw <- read.table(text = "date parameter value
2020-07-01T23:50:00Z wind_dir 236.0
2020-07-01T23:40:00Z wind_dir 236.0
2020-07-01T23:40:00Z wind_speed 1.9
2020-07-01T23:30:00Z wind_dir 239.0
2020-07-01T23:10:00Z wind_dir 184.0
2020-07-01T23:00:00Z wind_dir 178.0
2020-07-01T22:50:00Z wind_speed 1.1
2020-07-01T22:50:00Z wind_dir 197.0
2020-07-01T22:40:00Z wind_speed 1.8
2020-07-01T22:30:00Z wind_speed 1.4
2020-07-01T22:20:00Z wind_dir 172.0
2020-07-01T22:20:00Z wind_speed 1.4
2020-07-01T22:00:00Z wind_dir 170.0", header = TRUE)
raw$date <- trimws(gsub("[TZ]", " ", raw$date))
library(tidyr)
packageVersion("tidyr")
#> [1] '1.1.2'
raw <- pivot_wider(raw,
names_from = "parameter",
values_from = "value")
raw
#> # A tibble: 10 x 3
#> date wind_dir wind_speed
#> <chr> <dbl> <dbl>
#> 1 2020-07-01 23:50:00 236 NA
#> 2 2020-07-01 23:40:00 236 1.9
#> 3 2020-07-01 23:30:00 239 NA
#> 4 2020-07-01 23:10:00 184 NA
#> 5 2020-07-01 23:00:00 178 NA
#> 6 2020-07-01 22:50:00 197 1.1
#> 7 2020-07-01 22:40:00 NA 1.8
#> 8 2020-07-01 22:30:00 NA 1.4
#> 9 2020-07-01 22:20:00 172 1.4
#> 10 2020-07-01 22:00:00 170 NA
由 reprex package (v2.0.0)
于 2021-10-18 创建