【问题标题】:R - Using reshape() to turn data frame into a two column matrixR - 使用 reshape() 将数据框转换为两列矩阵
【发布时间】:2014-09-26 19:02:48
【问题描述】:

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

代码 Bucket1 Bucket2

1 绿蓝

2 绿色(空白)

3(空白)(空白)

4(空白)蓝色

进入:

代码桶

1个绿色

1 蓝色

2 绿色

4 蓝色

任何人都可以帮助 reshape() 吗?

【问题讨论】:

  • 这并不能直接回答问题,但这里有一个很好的reshape2 教程:seananderson.ca/2013/10/19/reshape.html。一旦你弄清楚了,你应该发布你的解决方案作为你自己问题的答案。
  • 我发现这个来自统计软件杂志的 one 对 Hadley 本人很有帮助。

标签: r


【解决方案1】:

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),当然还有其他方法可以在melting 之后操作结果。

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

【讨论】:

  • 你可以完全跳过dplyr,直接使用dat.melted$variable <- NULLdat.melted <- dat.melted[order(dat.melted$Code)]
【解决方案2】:
  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]

【讨论】:

  • 我的度量值不是返回“绿色”和“蓝色”,而是返回为“1”。如何返回因子名称?
  • 先将它们转换为字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2018-10-06
  • 2012-05-20
  • 1970-01-01
相关资源
最近更新 更多