每天我都有一个带有id和一些变量的新csv文件。 ids可以在几天内不同。我想拍摄一天的ID并跟踪变量随时间的变化情况。
我的目标是创建像这样的区域图:
例如,我在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)?
在您看来,哪种方法更好?
谢谢! (对不起标题,我找不到更好......)