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

来源帧:

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 = 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(在这种情况下,你将不得不重复并与FALSE替换它们)。

,否则可以使用castreshape包(的看到这个问题中的示例),并设置默认到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

其他提示

下面是一个使用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)
scroll top