【问题标题】:Reshape data frame to convert factors into columns in R重塑数据框以将因子转换为 R 中的列
【发布时间】:2011-01-25 03:14:01
【问题描述】:

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

【问题讨论】:

    标签: r reshape factors


    【解决方案1】:

    我会尝试绑定另一个名为“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 替换它们)。

    否则您可以使用reshape 包外的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
    

    【讨论】:

    • 谢谢。我应该考虑创建一个值列。有趣的是,在 26 个因子级别的 9,500 行上,值列/重塑方法需要 1.4 秒,而使用迭代方法(超过级别)只需要 0.6 秒。
    • 不要被这些函数所欺骗:reshape 函数本身会进行迭代,如果您查看它。但除此之外它还有很多其他作用,这将增加总时间。 reshape 之类的东西并不是为了表现得更好;它们只是为了使数据操作更容易。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2019-03-07
      相关资源
      最近更新 更多