R 中的多维数组到表

问题描述 投票:0回答:2

我有多维数组

, , 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
功能。因为这个函数没有给我我想要的数据表

r multidimensional-array
2个回答
2
投票

我认为解决您问题的关键和开始是使用

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

0
投票

您可以将

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" 
© www.soinside.com 2019 - 2024. All rights reserved.