我有一个交叉表(由table
制作),行中的个人和列中的年份。为了节省水平空间,我想使用两位数而不是四位数年份(下游通过xtable
进入LaTeX)。但是当我使用有序因子(通过ordered()
或factor(..., ordered=TRUE)
)时,我得到数字排序而不是按时间顺序排列。
我如何按时间顺序排列列?似乎当我将有序因子传递给table
时,我失去了排序属性。
# representative data
dates <- as.Date("2010-01-01") - seq(30*365)
DF <- data.frame(day=sample(dates, 100, replace=TRUE),
id=sample(letters[1:5], 100, replace=TRUE))
DF$year <- as.numeric(format(DF$day, "%Y"))
# the table I want
table(DF$id, DF$year)
# but I'd like two year dates to save horizontal space
# but keep chronological order
DF <- DF[order(DF$day), ]
DF$yearShort <- factor(format(DF$day, "%y"), ordered=TRUE)
# but even though yearShort is ordered, the table isn't
is.ordered(DF$yearShort)
tab <- table(DF$id, DF$yearShort)
tab
# I can't order by rownames, either
tab[, order(dimnames(tab)[[2]])]
答案 0 :(得分:1)
我对这个解决方案并不感到自豪,但它可以做你想做的事情:)
> tab2 <- table(DF$id, DF$year)
> colnames(tab2) <- substr(colnames(tab2),3,4)
> tab2
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 98 99 00 01 02 03 04 05 06 07 08 09
a 0 2 0 2 2 2 0 1 0 2 0 1 0 2 2 0 1 0 1 0 0 1 1 1 0 1 1 1 1
b 1 1 0 2 0 0 0 0 1 2 1 0 0 0 2 0 1 1 1 0 0 1 3 0 1 0 0 0 1
c 3 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 0 0 2 0
d 0 0 1 3 1 0 1 0 0 1 1 3 1 1 0 1 0 0 2 0 1 0 1 2 0 0 0 0 0
e 1 0 2 0 3 1 0 0 1 0 0 3 1 0 0 0 0 2 1 1 1 0 1 0 1 1 1 0 0