简单的数据框重塑

7

我刚从长时间的写作停顿中回到R环境,我遇到了一些记不清如何重新塑形数据的问题。 我知道自己想做的很容易,但出于某种原因,今晚我变得愚笨了,并把melt和reshape搞混了。 如果有人能够快速指点我正确的方向,那将是非常感激的。

我有一个这样的数据框:

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

我希望最终得到按年份和人员统计事件的数量: (以便我可以为每个人在多年间绘制快速折线图) 例如:
person    year1    year2
personA   4        2
personB   0        2

非常感谢您的阅读。
许多感谢您的阅读。
3个回答

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

这太棒了 - 之前用过reshape,但没用过reshape2 - 非常感谢。 - user1378122

7
在这种情况下,您可以简单地使用tapply
> with(data, tapply(week, list(person=person, year=year), length))
         year
person     1 2
  personA  4 2
  personB NA 2

结果是一个矩阵。如果有空单元格,此解决方案会产生NAs。

我一直在想是否可以将“NA”纳入到这个解决方案中...一种方法是将“NA”更改为某些奇怪的值,但我想知道是否有现成的解决方案...你有什么想法吗? - Roman Luštrik

5

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

您可以将其输出传递给matplot,因为它返回一个表格/矩阵对象:
matplot( xtabs(~person+year, data=dat))

这个小例子的输出x轴可能不是你想要的,但随着时间的推移,可能会有更令人满意的默认轴标签。或者你可以使用xaxt="n"来抑制默认的x轴标签,并使用axis按照你的意愿进行标记:

matplot(  xtabs(~person+year, data=dat), xaxt="n", type="b")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接