我有多维数组
, , 1
[,1] [,2]
[1,] "0" "a"
[2,] "1" "a"
[3,] "1" "b"
[4,] "1" "b"
[5,] "1" "b"
, , 2
[,1] [,2]
[1,] "0" "a"
[2,] "1" "a"
[3,] "1" "b"
[4,] "0" "b"
[5,] "1" "b"
我想将多维数组转换为表格,这样我就可以得到这样的表格
1 0 a
1 1 a
1 1 b
1 1 b
1 1 b
2 0 a
2 1 a
2 1 b
2 0 b
2 1 b
有可能吗?我想我不能使用
melt
功能。因为这个函数没有给我我想要的数据表
我认为解决您问题的关键和开始是使用
as.data.frame.matrix
。
可重现的数据:
set.seed(42)
ary <- array(sample(letters, size=20, replace=TRUE), dim=c(5,2,2))
ary[,1,] <- match(ary[,1,], unique(ary[,1,]))
ary
# , , 1
# [,1] [,2]
# [1,] "1" "d"
# [2,] "2" "r"
# [3,] "3" "z"
# [4,] "4" "q"
# [5,] "5" "o"
# , , 2
# [,1] [,2]
# [1,] "6" "n"
# [2,] "7" "t"
# [3,] "8" "z"
# [4,] "4" "r"
# [5,] "2" "o"
答案:
out <- reshape2::dcast(
Var1 + Var3 ~ Var2,
data = as.data.frame.table(ary),
value.var = "Freq")[,-1]
head(out)
# Var3 A B
# 1 A 1 d
# 2 B 6 n
# 3 A 2 r
# 4 B 7 t
# 5 A 3 z
# 6 B 8 z
如果您需要第一列(指示
ary
中的列为整数,您可以这样做:
out$Var3 <- match(out$Var3, sort(unique(out$Var3)))
out
# Var3 A B
# 1 1 1 d
# 2 2 6 n
# 3 1 2 r
# 4 2 7 t
# 5 1 3 z
# 6 2 8 z
# 7 1 4 q
# 8 2 4 r
# 9 1 5 o
# 10 2 2 o
只是为了尝试匹配您的输出(按第一列排序):
out[order(out$Var3),]
# Var3 A B
# 1 1 1 d
# 3 1 2 r
# 5 1 3 z
# 7 1 4 q
# 9 1 5 o
# 2 2 6 n
# 4 2 7 t
# 6 2 8 z
# 8 2 4 r
# 10 2 2 o
您可以将
Reduce
与 rbind
一起使用:
Reduce(rbind, sapply(1:dim(arr)[3], \(i) data.frame(id = i, arr[,,i]), simplify = FALSE))
id X1 X2
1 1 1 e
2 1 2 z
3 1 3 w
4 1 4 z
5 1 5 d
6 2 6 x
7 2 7 p
8 2 8 o
9 2 5 v
10 2 6 a
数据
arr <- structure(c("1", "2", "3", "4", "5", "e", "z", "w", "z", "d",
"6", "7", "8", "5", "6", "x", "p", "o", "v", "a"), .Dim = c(5L,
2L, 2L))
# , , 1
#
# [,1] [,2]
# [1,] "1" "e"
# [2,] "2" "z"
# [3,] "3" "w"
# [4,] "4" "z"
# [5,] "5" "d"
#
# , , 2
#
# [,1] [,2]
# [1,] "6" "x"
# [2,] "7" "p"
# [3,] "8" "o"
# [4,] "5" "v"
# [5,] "6" "a"