分析人口随时间的演变

时间:2015-07-03 09:08:35

标签: r dplyr

每天我都有一个带有id和一些变量的新csv文件。 ids可以在几天内不同。我想拍摄一天的ID并跟踪变量随时间的变化情况。

我的目标是创建像这样的区域图:enter image description here

例如,我在3月31日采取了所有的ID,每天我都会使用这些ID进行联接,然后我使用var" Code"来计算一个计数组。如果缺少id(这里是3月31日而不是D日),他们的代码将成为" NA"显示我失去的ID数量#34;随着时间的推移。我希望我足够清楚。

以下是我如何计算这个情节之王:(我的实际数据类似于li而不是datas

library(plyr)
library(dplyr)

datas <- data.frame(id1 = c("x", "y", "x", "y", "z", "x", "z"), 
                    id2 = c("x2", "y2", "x2", "y2", "z2", "x2", "z2"), 
                    code = c("code1", "code2", "code1", "code2", "code2", "code1", "code2"),
                    var = runif(7),
                    date = do.call(c, mapply(rep, seq(Sys.Date() - 2, Sys.Date(), by = 1), c(2, 3, 2))))

li <- split(datas, datas$date)

dateStart <- Sys.Date() - 2
dateEnd <- Sys.Date()
# A "filter" if I want to start with another date than the date min or end with another date than the max date
li <- li[as.Date(names(li)) >= dateStart & as.Date(names(li)) <= dateEnd]

dfCounts <- ldply(li, function(x) 
  left_join(li[[1]], x, by = c("id1", "id2")) %>% 
    group_by(code.y) %>% 
    count(code = code.y) %>% 
    mutate(freq = n / sum(n), 
           code = ifelse(is.na(code), "NA", code))), 
  .id = "date")

> dfCounts
date code n freq
1 2015-07-04    1 1  0.5
2 2015-07-04    2 1  0.5
3 2015-07-05    1 1  0.5
4 2015-07-05    2 1  0.5
5 2015-07-06    1 1  0.5
6 2015-07-06   NA 1  0.5

dfCounts %>% 
  ggplot(aes(date, freq)) + 
  geom_area(aes(fill = code), position = "stack")
# I have no idea why in this example, nothing is shown in the plot, but it works on my real datas

所以它有效,但如果我想观察更长的时间,我必须加入很多天(文件),它可能会很慢。你是否有任何想法在没有连接的情况下做同样的事情,使用带有dplyr或data.table的绑定数据(对象数据而不是li)?

在您看来,哪种方法更好?

谢谢! (对不起标题,我找不到更好......)

0 个答案:

没有答案