我有一个非常基本的R问题。我有下面的数据框,它有一个没有1年步长的年份列。
year <- c(1991,1993,1996)
value <-c(3, NA, 4)
但是,为了绘制折线图,我想要填充缺失的年份,以便以1年为步长获得从1990年到2000年的一系列数据。额外的年份应填充NA值。
这个问题有没有聪明的解决方案?
发布于 2020-12-01 19:38:12
我们可以使用tidyr
中的complete
。
dat <- data.frame(
year = c(1991,1993,1996),
value = c(3, NA, 4)
)
library(dplyr)
library(tidyr)
dat2 <- dat %>%
complete(year = 1990:2000)
print(dat2)
# # A tibble: 11 x 2
# year value
# <dbl> <dbl>
# 1 1990 NA
# 2 1991 3
# 3 1992 NA
# 4 1993 NA
# 5 1994 NA
# 6 1995 NA
# 7 1996 4
# 8 1997 NA
# 9 1998 NA
# 10 1999 NA
# 11 2000 NA
发布于 2020-12-01 19:52:37
使用碱基R生成1990 - 2000年的序列,并使用原始data.frame
生成merge
。
df1 <- data.frame(year = c(1991, 1993, 1996),
value = c(3, NA, 4))
merge(df1,
data.frame(full = seq(1990, 2000))
by.x = "year",
by.y = "full",
all = TRUE)
year value
1 1990 NA
2 1991 3
3 1992 NA
4 1993 NA
5 1994 NA
6 1995 NA
7 1996 4
8 1997 NA
9 1998 NA
10 1999 NA
11 2000 NA
发布于 2020-12-02 03:54:11
我们假设您拥有的是:
dd <- data.frame(year, value)
这是一个时间序列,因此使用时间序列表示(如ts、zoo或xts )表示它是有意义的。我们将其转换为zoo,然后转换为ts。后一种转换将填充缺失的年份。
library(zoo)
z <- read.zoo(dd)
tt <- as.ts(z)
tt
## Time Series:
## Start = 1991
## End = 1996
## Frequency = 1
## [1] 3 NA NA NA NA 4
如果你真的想把它转换成一个数据框,那就使用fortify.zoo(tt)
。
绘图
如果这样做的唯一原因是绘制折线图,那么也可以删除缺少的值。所有这些都会起作用。
plot(na.omit(dd), type = "l", xlab = "year", ylab = "value")
plot(na.omit(z), xlab = "year", ylab = "value")
library(ggplot2)
autoplot(na.omit(z)) + xlab("year") + ylab("value")
最后一张图如下所示:
https://stackoverflow.com/questions/65097273
复制相似问题