我刚刚从一个漫长的间隙写作回到R,我遇到了一些记住如何重塑数据的真正问题。 我知道我想要做的事情很容易,但由于某种原因,我今晚很愚蠢,并且把自己与融化和重塑混为一谈。 如果有人能够迅速指出我正确的方向,那将非常感激。
我有一个数据框:
person week year
personA 6 1
personA 22 1
personA 41 1
personA 42 1
personA 1 2
personA 23 2
personB 8 2
personB 9 2
....
personN x y
我希望按年份和按人数计算事件数量: (这样我可以为多年来为每个人绘制一个快速折线图)
e.g。
person year1 year2
personA 4 2
personB 0 2
非常感谢您阅读。
答案 0 :(得分:8)
我可能会使用reshape2
包和dcast
函数,因为它只需一步处理重塑和聚合:
library(reshape2)
> dcast(person ~ year, value.var = "year", data = dat)
Aggregation function missing: defaulting to length
person 1 2
1 personA 4 2
2 personB 0 2
答案 1 :(得分:7)
在这种情况下,您只需使用tapply
:
> with(data, tapply(week, list(person=person, year=year), length))
year
person 1 2
personA 4 2
personB NA 2
结果是矩阵。如果存在空单元,则此解决方案会生成NA。
答案 2 :(得分:5)
xtabs
非常适合这个问题:
dat <- read.table(text="person week year
personA 6 1
personA 22 1
personA 41 1
personA 42 1
personA 1 2
personA 23 2
personB 8 2
personB 9 2
", header=TRUE)
xtabs(~person+year, data=dat)
#-----------------
year
person 1 2
personA 4 2
personB 0 2
您可以将其输出传递给matplot,因为它返回一个表/矩阵对象:
matplot( xtabs(~person+year, data=dat))
这个小例子的输出x轴可能不是你想要的,但是有了更多年,可能会有一个更令人满意的默认轴标签。或者您可以使用xaxt =“n”来禁止默认的x轴标签,并使用axis
标记为您希望:
matplot( xtabs(~person+year, data=dat), xaxt="n", type="b")