【问题标题】:How to "back" melt function from reshape2 package?如何从 reshape2 包中“返回”熔化功能?
【发布时间】:2013-10-28 11:33:41
【问题描述】:

这是我的数据:

> head(data)

    id C1 C2 C3 B1 B2 B3 Name
    12 3  12 8  1  3  12 Agar
    14 4  11 9  5  12 14 LB
    18 7  17 6  7  14 16 YEF
    20 9  15 4  3  11 17 KAN

所以我使用了 reshape2 包中的 melt 函数来重新组织我的数据。现在看起来像这样:

dt <- melt(data, measure.vars=2:7)

> head(dt)

   n    v variable value   rt
1 id Name        p    C1   1
2 12 Agar        p     3   2
3 14   LB        p     4   3
4 18  YEF        p     7   6
5 20  KAN        p     9   3
6 id Name        u    C2   1

我对我的数据进行了一些计算,现在有一个额外的列。我们称之为“rt”。我现在想用这个额外的列将我的数据转换为以前的“状态”。你知道有什么有用的功能吗?

dput(dt)
structure(list(n = structure(c(5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 
3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 
4L, 5L, 1L, 2L, 3L, 4L), class = "factor", .Label = c("12", "14", 
"18", "20", "id")), v = structure(c(4L, 1L, 3L, 5L, 2L, 4L, 1L, 
3L, 5L, 2L, 4L, 1L, 3L, 5L, 2L, 4L, 1L, 3L, 5L, 2L, 4L, 1L, 3L, 
5L, 2L, 4L, 1L, 3L, 5L, 2L), class = "factor", .Label = c("Agar", 
"KAN", "LB", "Name", "YEF")), variable = structure(c(1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 
4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L), .Label = c("p", 
"u", "k", "l", "t", "h"), class = "factor"), value = c("C1", 
"3", "4", "7", "9", "C2", "12", "11", "17", "15", "C3", "8", 
"9", "6", "4", "B1", "1", "5", "7", "3", "B2", "3", "12", "14", 
"11", "B3", "12", "14", "16", "17")), .Names = c("n", "v", "variable", 
"value"), row.names = c(NA, -30L), class = "data.frame")

【问题讨论】:

  • 有用的函数可能是dcast,但如果您需要有意义的帮助,则需要提供可重现的示例。
  • Please see this link。给出适当的可重复示例可能会得到更好更快的答案。
  • 你能告诉我我的例子中究竟缺少什么吗?我试图遵循所有规则:给出最小数据集,提到包。如果您的意思是可运行代码,那么我不知道应该使用哪个函数。那么让我们试试这个 dcast :)。
  • @ShaxiLiver,要创建可重现的代码,请使用dput 或手动创建一个小示例。

标签: r reshape2


【解决方案1】:

在“reshape2”宇宙中,melt*cast 携手并进。

下面是melting 和data.framedcast 将其恢复为原始形式的示例。您需要对数据采取类似的方法。

mydf <- data.frame(A = LETTERS[1:3], B = 1:3, C = 4:6)
mydf
#   A B C
# 1 A 1 4
# 2 B 2 5
# 3 C 3 6

library(reshape2)

mDF <- melt(mydf, id.vars="A")
mDF
dcast(mDF, A ~ variable, value.var="value")
#   A B C
# 1 A 1 4
# 2 B 2 5
# 3 C 3 6

dcast 步骤中,将~ 之前的项视为“id”变量,将后面的项视为结果列名。 value.var 应该是将值填充到由 id 变量和列名创建的结果“网格”中的列。

【讨论】:

  • 是的,这就是我要找的。现在我只需要尝试使其适合我的数据集,这并不容易。
  • @ShaxiLiver,我想我很容易看到你的问题。您似乎融化了一个以列名作为第一行的数据集。尽管如此,您仍然可以通过以下方式获得大部分的成功:dcast(dt, n + v ~ variable, value.var="value")
  • 是的,就是这样。最后一个问题是新数据集的最后一行应该是第一个准确的。知道如何解决吗?
  • 这里有两个选项,假设我们以out &lt;- dcast(dt, n + v ~ variable, value.var="value") 开头。 (1) 只需根据需要重新排列行:out[c(5, 1:4), ]。 (2)实际创建真实列名:setNames(out[-5, ], sapply(out[5, ], as.character)).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2023-03-13
  • 2016-10-19
  • 1970-01-01
  • 2019-12-01
  • 2016-12-21
  • 1970-01-01
相关资源
最近更新 更多