在 R 中重构数据

Restructure Data in R

提问人:Btibert3 提问时间:8/13/2010 最后编辑:FerdiBtibert3 更新时间:12/21/2016 访问量:2851

问:

我刚刚开始超越 R 的基础知识,并且已经到了需要一些帮助的地步。我想重构一些数据。下面是示例数据帧的外观:

ID  Sex Res Contact
1   M   MA  ABR
1   M   MA  CON
1   M   MA  WWF
2   F   FL  WIT
2   F   FL  CON
3   X   GA  XYZ

我希望数据如下所示:

ID  SEX Res ABR CON WWF WIT XYZ
1   M   MA  1   1   1   0   0
2   F   FL  0   1   0   1   0
3   X   GA  0   0   0   0   1

我有哪些选择?我将如何在 R 中做到这一点?

简而言之,我希望保留 CONT 列的值,并将它们用作重构数据框中的列名。我想保持一组变量列不变(在上面的示例中,我保持 ID、和 Res 不变)。

另外,是否可以控制重构数据中的值?我可能希望将数据保留为二进制数据。我可能希望一些数据的值是每个 ID 的每个联系人值存在的次数。

r 数据操作

评论


答:

12赞 JoFrhwld 8/13/2010 #1

套餐就是你想要的。文档在这里:http://had.co.nz/reshape/。不是为了吹嘘我自己的喇叭,但我也在这里写了一些关于 的用法的说明: http://www.ling.upenn.edu/~joseff/rstudy/summer2010_reshape.htmlreshapereshape

出于您的目的,此代码应该有效

library(reshape)
data$value <- 1
cast(data, ID + Sex + Res ~ Contact, fun = "length")

评论

0赞 Daniel Dickison 8/13/2010
我已经使用 R 很长时间了,我从来不知道你可以做 data$value <- 1 而不是 data$value <- rep(1, nrow(data))。简直不敢相信我从来没有尝试过——这总是有效吗?
0赞 JoFrhwld 8/13/2010
@Daniel 你也应该尝试data$variable <- 1; data$variable[data$Group == "A"] <- 2
0赞 Btibert3 8/13/2010
我知道 Hadley 的重塑方案可能是答案,但我很难理解它。在您的代码中,赋值为 1 的 data$value 有什么作用?
0赞 JoFrhwld 8/13/2010
对于 ,它所指的一定有某个测量值。该公式定义“矩阵”,然后查找适合每个单元格的所有值。默认情况下,它会在名为 的列中查找值,但您可以覆盖它。我必须添加一列,因为在定义矩阵后,没有与测量值对应的列,所以我创建了一个虚拟列。如果每个单元格的值数 <= 1,则用该值填充单元格。否则,默认情况下,它会根据某个函数聚合值。reshapevaluevaluecastlength
0赞 JoFrhwld 8/13/2010
我定义了一个聚合函数,因为否则,没有观测值的单元格将被填充。如果需要,请使用 聚合值。NA0valuelength
2赞 Vince 8/13/2010 #2

model.matrix效果很好(这是最近被问到的,gappy有一个很好的答案):

> model.matrix(~ factor(d$Contact) -1)
  factor(d$Contact)ABR factor(d$Contact)CON factor(d$Contact)WIT factor(d$Contact)WWF factor(d$Contact)XYZ
1                    1                    0                    0                    0                    0
2                    0                    1                    0                    0                    0
3                    0                    0                    0                    1                    0
4                    0                    0                    1                    0                    0
5                    0                    1                    0                    0                    0
6                    0                    0                    0                    0                    1
attr(,"assign")
[1] 1 1 1 1 1
attr(,"contrasts")
attr(,"contrasts")$`factor(d$Contact)`
[1] "contr.treatment"

评论

0赞 Vince 8/13/2010
哎呀!误解了这个问题。你可以先用我的答案,然后再用,但 JoFrhwld 的答案更容易。tapply