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

时间:2010-03-08 19:27:38

标签: r reshape factors

我有一个数据框,其中一个特定列具有一组特定值(比方说,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()没有产生预期的结果。非常感谢帮助。

2 个答案:

答案 0 :(得分:15)

我会尝试绑定另一个名为“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包中的reshapesee this question for an example),并将默认值设置为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

答案 1 :(得分:3)

这是使用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)