我有一个名为trendtable的时间序列矩阵,其中包含1960年至2010年的数据(57列),适用于175个国家。列名称为年份,并给出了相应的值。我需要找到它们之间的区别用于查找每个国家/地区趋势的列,以查找趋势是上升还是下降。得到的趋势值应该在新表中。我写的代码如下所述,但我猜错了。
for (i in 1:175) {
Trend=0
for (j in 5:56) {
Dif=TimeSeriesCO2[i,j]-TimeSeriesCO2[i,j+1]
if(Dif<0){
Trend--}
else{
Trend++}
}
TrendTable<-rbind(TrendTable,Trend)
}
答案 0 :(得分:0)
这是一个伪造的假数据:
set.seed(42)
nc <- 9 ; nr <- 5
mtx <- t(replicate(nr, cumsum(sample(-3:3, size = nc, replace = TRUE))))
dimnames(mtx) <- list(LETTERS[seq_len(nr)], 2000 + seq_len(nc))
mtx
# 2001 2002 2003 2004 2005 2006 2007 2008 2009
# A 3 6 5 7 8 8 10 7 8
# B 1 1 3 6 4 4 7 10 7
# C 0 0 3 0 3 6 3 3 2
# D 3 3 5 7 9 8 9 6 8
# E -3 -5 -2 -1 -2 -2 -5 -2 -2
所以我用五个字母模拟你的175个国家,用9个字母模拟57年。
第一次削减可能是确定一年是否大于或等于上一年。
t(apply(mtx, 1, diff) >= 0)
# 2002 2003 2004 2005 2006 2007 2008 2009
# A TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE
# B TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE
# C TRUE TRUE FALSE TRUE TRUE FALSE TRUE FALSE
# D TRUE TRUE TRUE TRUE FALSE TRUE FALSE TRUE
# E FALSE TRUE TRUE FALSE TRUE FALSE TRUE TRUE
(t
对apply
的结果进行调整的必要性可能不直观,但却是处理它的事实。如果没有t
ranspose,可能有办法做到这一点,但没有我知道在基地R中是直接的。)
请注意,列数少于原始数据集中的列数。如果累积增加与否,我想在每年跟踪,有人可能会这样做:
t(apply(mtx, 1, function(a) cumsum(diff(a) >= 0)))
# 2002 2003 2004 2005 2006 2007 2008 2009
# A 1 1 2 3 4 5 5 6
# B 1 2 3 3 4 5 6 6
# C 1 2 2 3 4 4 5 5
# D 1 2 3 4 4 5 5 6
# E 0 1 2 2 3 3 4 5
但我不一定能找到更多信息。
从您的代码中看,您可能希望每个国家(字母)都有一个号码,在这种情况下,您可以进一步简化为:
apply(mtx, 1, function(a) sum(diff(a) >= 0))
# A B C D E
# 6 6 5 6 5
至于以某种方式将此添加到您当前的数据中,我既不确定您想要的内容(来自您的示例),也不建议将摘要数据附加到原始矩阵。唯一的例外是立即可视化,而不是存储。