R - 使用reshape()将数据帧转换为两列矩阵

时间:2014-09-26 19:02:48

标签: r

我尝试使用reshape()函数的许多变体(reshape2包)将不同因子的数据帧转换为两列矩阵,但我没有成功。我还需要忽略空白。这是我尝试完成的一个简化示例:

Code Bucket1 Bucket2

1绿蓝

2绿色(空白)

3(空白)(空白)

4(空白)蓝色

INTO:

代码存储区

1绿色

1蓝色

2绿色

4 Blue

有人可以帮助reshape()?

2 个答案:

答案 0 :(得分:2)

reshape2 包中包含melt函数,用于将数据集从 wide 转换为 long 格式。有一个reshape函数,它是** stats *包的一部分,它对重塑数据也很有用,但不是我熟悉的函数。

要重塑您所描述的数据,可以按如下方式使用melt。我猜你的空白是NA,所以我使用na.rm参数删除它们。我使用value.name参数来命名创建的新列。

melt(dat, id.vars = "Code", na.rm = TRUE, value.name = "Bucket")

结果:

  Code variable Bucket
1    1  Bucket1  Green
2    2  Bucket1  Green
5    1  Bucket2   Blue
8    4  Bucket2   Blue

这并不能提供您请求的确切输出,因为您希望最终数据集按特定顺序排列,而不需要新的variable列。您可以使用 dplyr 包中的一些便捷功能删除额外列(使用select)并按Code排序(使用arrange),尽管肯定有其他方法可以在melt之后操纵结果。

require(dplyr)
dat %>% 
    melt(id.vars = "Code", na.rm = TRUE, value.name = "Bucket") %>%
    select(-variable) %>%
    arrange(Code)

现在结果如下:

  Code Bucket
1    1  Green
2    1   Blue
3    2  Green
4    4   Blue

答案 1 :(得分:1)

  library(data.table)

  dat <- as.data.table(your_original_data.frame)

  dat[, c(Bucket1, Bucket2), by=Code]
     Code    V1
  1:    1 Green
  2:    1  Blue
  3:    2 Green
  4:    2    NA
  5:    3    NA
  6:    3    NA
  7:    4    NA
  8:    4  Blue

  ## To drop the NA's 
  dat[, c(Bucket1, Bucket2), by=Code][!is.na(V1)]
     Code    V1
  1:    1 Green
  2:    1  Blue
  3:    2 Green
  4:    4  Blue

  ## if they are actually called "(Blank)" use 
  dat[, c(Bucket1, Bucket2), by=Code][V1 != "(Blank)"]

更新:要将您的因子转换为字符:

   colsToConvert <- setdiff(names(dat), "Code") # or manually type them 
   dat[, c(colsToConvert) := lapply(.SD, as.character), .SDcols = colsToConvert]