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 创建依赖于两个相当大的假设:
- 数据创建者没有以破坏原始顺序的方式对数据进行排序。
- 未删除
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
我无法解决(或找到解决方案)的简单问题:
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
:
molten$id <- rep(1:(nrow(molten) / 2), 2)
那么上面的dcast
方法就可以了。当然,被融化的变数可能不止两个。您可以概括 rep
如下:
molten$id <- rep(1:(nrow(molten) / length(unique(variable))),
length(unique(variable)))
请注意,此 ID 创建依赖于两个相当大的假设:
- 数据创建者没有以破坏原始顺序的方式对数据进行排序。
- 未删除
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