16

我有一个数据框,其中一个特定列具有一组特定值(例如,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()没有产生预期的结果。帮助将不胜感激。

4

2 回答 2

16

我会尝试绑定另一个名为“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(在这种情况下,您将不得不迭代并用 FALSE 替换它们)。

否则,您可以使用包cast外(请参阅此问题以获取示例),并将默认设置为.reshapeFALSE

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
于 2010-03-08T19:34:36.893 回答
4

这是另一种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)
于 2010-03-08T23:29:04.853 回答