两行显示一段时间内的比例值(变量不是时间格式化的)

时间:2018-03-09 16:15:20

标签: r ggplot2

我是R的新手并且不知道在哪里寻找这个,所以如果这是一个超级愚蠢的问题,请道歉。

我有一个包含以下变量的数据集:

   month day group Y
id
1  11    29  1     0
2  11    29  0     0
3  11    29  0     1
4  11    30  1     1
5  11    30  0     1
6  12    01  1     0
7  12    01  0     0
8  12    02  1     0
9  12    02  0     1
....................
98 12    30  0     1
99 12    30  1     0

为此,我想打印一个情节

  • 以x轴为时间线(由monthday组成),
  • 两行,一行用于group = 0,另一行用于group = 1,显示
  • (在y轴上)相应日的Y比例。

我认为这很简单,但由于我很新,我不知道如何(i)将月份/日期转换为(我认为是)ggpolt2可以解释的内容和(ii)绘制每组每天的比例。

非常感谢任何帮助!非常感谢! :)

3 个答案:

答案 0 :(得分:1)

这里是R中基函数的答案。你的问题意味着你需要ggplot2,当然你可以用它来绘制这样的情节,但基础图形也会解释日期。

set.seed(25)

创建一个类似于您的可重现数据框:

 df <- data.frame(id = 1:100, 
             month = floor(runif(100, 10,12)), 
             day = floor(runif(100,1,10)),
             group = rbinom(100, 1, 0.5), 
             Y = rbinom(100, 1, 0.5))

 df

创建日期列,您需要一年的日期,您可以添加额外的列或使用固定年份

 df$date <- as.Date(paste(df$day, df$month, "2018", sep = "-"), format = "%d-%m-%Y")

计算每组的比例并存储为新对象

 res <- aggregate(df$Y, list(df$group,df$date), mean)

设置绘图区域

 plot(res$Group.2, res$x, type = "n", xlab = "Date", ylab = "Proportion")

绘制每一行

 with(res[res$Group.1 == 0,], lines(Group.2, x, lty = 1))
 with(res[res$Group.1 == 1,], lines(Group.2, x, lty = 3))

添加图例

 legend("top", lty = c(1,3), legend= c("Group 0", "Group 1"), bty = "n")

如果你想在ggplot中这样做,那么你可以这样做:

library(ggplot2)
ggplot(res, aes(x = Group.2, y = x, color = as.factor(Group.1))) +
  geom_line()

答案 1 :(得分:0)

这里的想法是使用数据表进行计算。 首先是设置日期格式(我在这里选择posixct)

library(data.table)
library(ggplot2)
plouf <- setDT(plouf)
plouf[,Date := as.Date(paste0(month," ",day),format = "%m %d")]

创建一个每天Y之和的列后,只是因为在

之后计算比例很方便
plouf[,sumy := sum(Y), by = Date]

然后我计算出每组的比例

plouf[group == 1, ratio := ifelse(sumy != 0, sum(Y)/sumy,0), by = Date]
plouf[group == 0, ratio := ifelse(sumy != 0, sum(Y)/sumy,0), by = Date]

这是gplot

的结果
ggplot(data = plouf, aes(Date,ratio,color = as.factor(group) )) +
  geom_line()

enter image description here

数据

plouf <- read.table(text ="
id month day group Y 
1  11    29  1     0
2  11    29  0     0
3  11    29  0     1
4  11    30  1     1
5  11    30  0     1
6  12    01  1     0
7  12    01  0     0
8  12    02  1     0
9  12    02  0     1", header = T)

答案 2 :(得分:0)

这样的东西?

df <- data.frame(id = 1:200, 
                 month = sample(10:12, 200, replace = T), 
                 day = sample(1:30, 200, replace = T),
                 group = rbinom(200, 1, 0.5), 
                 Y = rbinom(200, 1, 0.5))

df <- df %>%
  mutate(Date = as.POSIXct(paste(month, day), format = "%m %d")) %>%
  arrange(Date)

df %>% group_by(Date, group) %>%
  summarise(n = length(unique(Y))) %>%
  mutate(pct = n / 2) %>%
  ggplot(aes(Date, pct, group = group, color = as.factor(group))) + 
  geom_line()