use*_*122 7 r reshape dataframe
我刚刚从一个漫长的间隙写作回到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
Run Code Online (Sandbox Code Playgroud)
我希望按年份和按人数计算事件数量:(这样我可以为多年来每个人绘制一个快速折线图)
例如
person year1 year2
personA 4 2
personB 0 2
Run Code Online (Sandbox Code Playgroud)
非常感谢阅读.
我可能会使用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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以简单地使用tapply:
> with(data, tapply(week, list(person=person, year=year), length))
year
person 1 2
personA 4 2
personB NA 2
Run Code Online (Sandbox Code Playgroud)
结果是一个矩阵.如果存在空单元,则该解决方案产生NA.
xtabs 从基地R非常适合这个问题:
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
Run Code Online (Sandbox Code Playgroud)
您可以将其输出传递给matplot,因为它返回一个表/矩阵对象:
matplot( xtabs(~person+year, data=dat))
Run Code Online (Sandbox Code Playgroud)
这个微小示例的输出x轴可能不是您想要的,但是使用更多年,可能会有更令人满意的默认轴标记.或者您可以使用xaxt ="n"来抑制默认的x轴标签,并根据需要使用axis标签:
matplot( xtabs(~person+year, data=dat), xaxt="n", type="b")
Run Code Online (Sandbox Code Playgroud)