转换面板数据
Transforming panal data
我正在处理一个国家数据集,不同的时间点有不同的值。每个月有一次观察,所以我使用了 as.date 函数,日期为 01-07-2018、01-08-2018 等。
每个国家和每个日期都存在相应的值。
我想将其转换为一个数据框,其中所有国家/地区的值都在一个日期聚合。
我已经尝试过重塑功能
reshape(Origin_wide, idvar = "Origin", timevar = "V5", direction = "wide")
V5 是日期变量,Origin 是国家。
据我所知,删除 as.date 集,这样日期和相应的值就不再被这样对待了。
可以更顺利地完成吗?数据序列的时间序列方面消失了,重塑功能丢失了,这样我就无法区分时间序列或按日期绘制等。
此外,日期有一个 "value" 前缀,据我所知这是同样的问题。
这里是数据结构:
| V5 | Origin | Value |
|---------------------|------------------|----------|
| 01-09-2017 | USA | 45 |
|---------------------|------------------|----------|
| 01-10-2017 | USA | 47 |
|---------------------|------------------|----------|
| 01-11-2017 | USA | 49 |
|---------------------|------------------|----------|
| 01-09-2017 | Canada | 7 |
|---------------------|------------------|----------|
| 01-10-2017 | Canada | 13 |
|---------------------|------------------|----------|
| 01-11-2017 | Canada | 17 |
|---------------------|------------------|----------|
这是我希望的样子:
| V5 | Canada | USA |
|---------------------|------------------|----------|
| 01-09-2017 | 7 | 45 |
|---------------------|------------------|----------|
| 01-10-2017 | 13 | 47 |
|---------------------|------------------|----------|
| 01-11-2017 | 17 | 49 |
|---------------------|------------------|----------|
希望这是有道理的。
要重现随机的小版本数据:
set.seed(1)
Data <- data.frame(Value = sample(1:10), Origin = sample(c("Mexico", "USA","Canada"), 10, replace = TRUE))
dates <- sample(seq(as.Date('2018/01/01'), as.Date('2018/05/01'), by="month"), 10, replace = TRUE)
Data <- cbind(dates,Data)
A look on the data as produced by the code
这里很明显,并未为所有日期定义值。在这种情况下,该日期的值 = 0。因此,在我第一次尝试重塑时,它会为所有没有观测值的日期生成 NA,这是完美的,因为我可以输入 0。
重新创建您的数据
library(tidyverse)
tbl <- tibble(
V5 = rep(c("01-09-2017", "01-10-2017", "01-11-2017"), 2),
Origin = rep(c("USA", "Canada"), each = 3),
Value = c(45, 47, 49, 7, 13, 17)
)
代码
tbl %>%
spread(Origin, Value)
结果
# A tibble: 3 x 3
V5 Canada USA
<chr> <dbl> <dbl>
1 01-09-2017 7 45
2 01-10-2017 13 47
3 01-11-2017 17 49
我不确定用 0
替换 NA
是个好主意,因为那些确实是缺失值,而不是 0
的值。但是如果你真的想这样做,那么你可以这样做:
result <- tbl %>%
spread(Origin, Value)
result[is.na(result)] <- 0
注意:您的玩具示例是随机的,并不代表您实际数据的模式。 运行 它上面的代码输出了一个非常难看的宽格式。当您创建玩具示例时,请尽量确保它反映您的真实数据的特征。
我正在处理一个国家数据集,不同的时间点有不同的值。每个月有一次观察,所以我使用了 as.date 函数,日期为 01-07-2018、01-08-2018 等。 每个国家和每个日期都存在相应的值。 我想将其转换为一个数据框,其中所有国家/地区的值都在一个日期聚合。 我已经尝试过重塑功能
reshape(Origin_wide, idvar = "Origin", timevar = "V5", direction = "wide")
V5 是日期变量,Origin 是国家。 据我所知,删除 as.date 集,这样日期和相应的值就不再被这样对待了。 可以更顺利地完成吗?数据序列的时间序列方面消失了,重塑功能丢失了,这样我就无法区分时间序列或按日期绘制等。 此外,日期有一个 "value" 前缀,据我所知这是同样的问题。
这里是数据结构:
| V5 | Origin | Value |
|---------------------|------------------|----------|
| 01-09-2017 | USA | 45 |
|---------------------|------------------|----------|
| 01-10-2017 | USA | 47 |
|---------------------|------------------|----------|
| 01-11-2017 | USA | 49 |
|---------------------|------------------|----------|
| 01-09-2017 | Canada | 7 |
|---------------------|------------------|----------|
| 01-10-2017 | Canada | 13 |
|---------------------|------------------|----------|
| 01-11-2017 | Canada | 17 |
|---------------------|------------------|----------|
这是我希望的样子:
| V5 | Canada | USA |
|---------------------|------------------|----------|
| 01-09-2017 | 7 | 45 |
|---------------------|------------------|----------|
| 01-10-2017 | 13 | 47 |
|---------------------|------------------|----------|
| 01-11-2017 | 17 | 49 |
|---------------------|------------------|----------|
希望这是有道理的。 要重现随机的小版本数据:
set.seed(1)
Data <- data.frame(Value = sample(1:10), Origin = sample(c("Mexico", "USA","Canada"), 10, replace = TRUE))
dates <- sample(seq(as.Date('2018/01/01'), as.Date('2018/05/01'), by="month"), 10, replace = TRUE)
Data <- cbind(dates,Data)
A look on the data as produced by the code
这里很明显,并未为所有日期定义值。在这种情况下,该日期的值 = 0。因此,在我第一次尝试重塑时,它会为所有没有观测值的日期生成 NA,这是完美的,因为我可以输入 0。
重新创建您的数据
library(tidyverse)
tbl <- tibble(
V5 = rep(c("01-09-2017", "01-10-2017", "01-11-2017"), 2),
Origin = rep(c("USA", "Canada"), each = 3),
Value = c(45, 47, 49, 7, 13, 17)
)
代码
tbl %>%
spread(Origin, Value)
结果
# A tibble: 3 x 3
V5 Canada USA
<chr> <dbl> <dbl>
1 01-09-2017 7 45
2 01-10-2017 13 47
3 01-11-2017 17 49
我不确定用 0
替换 NA
是个好主意,因为那些确实是缺失值,而不是 0
的值。但是如果你真的想这样做,那么你可以这样做:
result <- tbl %>%
spread(Origin, Value)
result[is.na(result)] <- 0
注意:您的玩具示例是随机的,并不代表您实际数据的模式。 运行 它上面的代码输出了一个非常难看的宽格式。当您创建玩具示例时,请尽量确保它反映您的真实数据的特征。