R - 不能反转熔化

R - Can't reverse melt

我无法解决(或找到解决方案)的简单问题:

df <- data.frame(A1 = sample(1:100, 10, replace = TRUE), A2 = sample(1:100, 10, replace = TRUE))
molten <- melt(df)

我怎样才能扭转这一局面并取回原来的 df? dcast 和 cast 都不适合我。

如果您首先构造和 ID 变量,它会起作用

df$id <- 1:nrow(df)
molten <- melt(df, id.var="id")
dcast(molten, id~variable)

如果您已经处于熔化状态,请注意您的示例中的行已正确排序。您可以利用它来构造一个带有 rep:

的 ID
molten$id <- rep(1:(nrow(molten) / 2), 2)

那么上面的dcast方法就可以了。当然,被融化的变数可能不止两个。您可以概括 rep 如下:

molten$id <- rep(1:(nrow(molten) / length(unique(variable))), 
                 length(unique(variable)))

请注意,此 ID 创建依赖于两个相当大的假设:

  1. 数据创建者没有以破坏原始顺序的方式对数据进行排序。
  2. 未删除 melt 中的任何缺失值。

您可以使用 table 部分测试第二个问题。目视检查 "variable" 的所有级别是否具有相同的长度。这不是万无一失的,而是一个很好的指标。

这可以通过 unstack

轻松完成
unstack(molten, value~variable)
#   A1 A2
#1  49 46
#2  51 75
#3  41 27
#4  75  4
#5  91 79
#6  19 87
#7  24 18
#8  96 57
#9  87 42
#10  8 47

或者另一个选项是 spread 来自 tidyr 创建序列列后

library(dplyr)
library(tidyr)
molten %>% 
    group_by(variable) %>%
    mutate(n = row_number()) %>% 
    spread(variable, value) %>% 
    select(-n)    
#      A1    A2
#   <int> <int>
#1     49    46
#2     51    75
#3     41    27
#4     75     4
#5     91    79
#6     19    87
#7     24    18
#8     96    57
#9     87    42
#10     8    47