代码之家  ›  专栏  ›  技术社区  ›  Alexander L. Belikoff

重新调整数据帧的形状以将因子转换为r中的列

  •  15
  • Alexander L. Belikoff  · 技术社区  · 14 年前

    我有一个数据框架,其中一个特定的列有一组特定的值(比如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 回复  |  直到 14 年前
        1
  •  15
  •   Community George Stocker    7 年前

    我将尝试绑定另一个名为“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 离开 重塑 包装( see 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
    
        2
  •  3
  •   Jonathan Chang    14 年前

    下面是另一种方法 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)