重塑数据框以将因子转换为R中的列

问题描述:

我有一个数据框,其中一个特定列具有一组特定值(比方说,1,2,...,23)。我想要做的就是从这个布局转换到这个布局,在那里框架会有额外的23个(在这种情况下)列,每个列代表一个因子值。这些列中的数据会显示特定的行是否有一个给定的因子值...要显示一个具体的例子布尔:重塑数据框以将因子转换为R中的列

源帧:

ID  DATE   SECTOR 
123  2008-01-01 1 
456  2008-01-01 3 
789  2008-01-02 5 
... <more records with SECTOR values from 1 to 5> 

所需的格式:

ID  DATE   SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5 
123  2008-01-01  T   F   F   F   F 
456  2008-01-01  F   F   T   F   F 
789  2008-01-02  F   F   F   F   T 

我在循环中没有问题,但我希望有更好的方法。到目前为止,reshape()没有产生期望的结果。帮助将不胜感激。

我会尝试绑定另一个名为“value”的列并设置value = TRUE

df <- data.frame(cbind(1:10, 2:11, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
df <- data.frame(df, value=TRUE) 

然后做一个重塑:

reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide") 

与使用reshape功能的问题是,对于缺失值默认为NA(在这种情况下,你将不得不重复和虚假替换它们) 。

否则,您可以在reshape包(see this question for an example)中使用cast,并将缺省值设置为FALSE

df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE) 
> df.wide 
    ID DATE  1  2  3 
1 1 2 TRUE FALSE FALSE 
2 2 3 FALSE TRUE FALSE 
3 3 4 FALSE FALSE TRUE 
4 4 5 TRUE FALSE FALSE 
5 5 6 FALSE TRUE FALSE 
6 6 7 FALSE FALSE TRUE 
7 7 8 TRUE FALSE FALSE 
8 8 9 FALSE TRUE FALSE 
9 9 10 FALSE FALSE TRUE 
10 10 11 TRUE FALSE FALSE 
+2

谢谢。我应该考虑创建一个价值栏。有趣的是,值列/重塑方法在9,500行上有26个因子水平需要1.4秒,而使用迭代方法(在水平上)只需要0.6秒。 – 2010-03-08 20:35:35

+3

不要被这些函数所欺骗:如果你看它,'reshape'函数本身会进行迭代。但除此之外,它还会做很多其他事情,这会增加整体时间。像“重塑”这样的东西并不打算表现更好;他们只是为了简化数据操作。 – Shane 2010-03-08 20:51:00

下面是使用xtabs另一种方法可能会或可能不会更快(如果有人想尝试,让我知道):

df <- data.frame(cbind(1:12, 2:13, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df) 
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo)