我有下面的单列矩阵,由值列(值)、X坐标列和Y坐标列组成。
X Y value
- - -
100 100 0.216
6100 100 0.00109
12100 100 0.00853
18100 100 0.0197
24100 100 0.000038
100 6100 0.506
6100 6100 0.00231
12100 6100 0.0125
18100 6100 0.0306
24100 6100 3.36E-005
100 12100 0.506
6100 12100 0.00231
12100 12100 0.0159
18100 12100 0.0329
24100 12100 3.93E-007
100 18100 0.506
6100 18100 0.00292
12100 18100 0.0163
18100 18100 0.000243
24100 18100 8.20E-007
100 24100 0.506
6100 24100 0.00322
12100 24100 0.000182
18100 24100 0.00019
24100 24100 5.38E-006
我想把它变换成这个矩阵:
XY 100 6100 12100 18100 24100
100 0.216 0.00109 0.00853 0.0197 0.000038
6100 0.506 0.00231 0.0125 0.0306 0.0000336
12100 0.506 0.00231 0.0159 0.0329 0.000000393
18100 0.506 0.00292 0.0163 0.000243 0.00000082
24100 0.506 0.00322 0.000182 0.00019 0.00000538
在R中怎么做呢?有这样的函数吗?
你可以这样做:
library(reshape2)
dcast(df, Y ~ X)
# Y 100 6100 12100 18100 24100
# 1 100 0.216 0.00109 0.008530 0.019700 3.80e-05
# 2 6100 0.506 0.00231 0.012500 0.030600 3.36e-05
# 3 12100 0.506 0.00231 0.015900 0.032900 3.93e-07
# 4 18100 0.506 0.00292 0.016300 0.000243 8.20e-07
# 5 24100 0.506 0.00322 0.000182 0.000190 5.38e-06
是否需要值100,6100,…作为行名,您可以这样做:
final <- dcast(df, Y ~ X)
rownames(final) <- final[, 1]
final[, 1] <- NULL
# final
# 100 6100 12100 18100 24100
# 100 0.216 0.00109 0.008530 0.019700 3.80e-05
# 6100 0.506 0.00231 0.012500 0.030600 3.36e-05
# 12100 0.506 0.00231 0.015900 0.032900 3.93e-07
# 18100 0.506 0.00292 0.016300 0.000243 8.20e-07
# 24100 0.506 0.00322 0.000182 0.000190 5.38e-06
数据如下:
df <- structure(list(X = c(100L, 6100L, 12100L, 18100L, 24100L, 100L,
6100L, 12100L, 18100L, 24100L, 100L, 6100L, 12100L, 18100L, 24100L,
100L, 6100L, 12100L, 18100L, 24100L, 100L, 6100L, 12100L, 18100L,
24100L), Y = c(100L, 100L, 100L, 100L, 100L, 6100L, 6100L, 6100L,
6100L, 6100L, 12100L, 12100L, 12100L, 12100L, 12100L, 18100L,
18100L, 18100L, 18100L, 18100L, 24100L, 24100L, 24100L, 24100L,
24100L), value = c(0.216, 0.00109, 0.00853, 0.0197, 3.8e-05,
0.506, 0.00231, 0.0125, 0.0306, 3.36e-05, 0.506, 0.00231, 0.0159,
0.0329, 3.93e-07, 0.506, 0.00292, 0.0163, 0.000243, 8.2e-07,
0.506, 0.00322, 0.000182, 0.00019, 5.38e-06)), .Names = c("X",
"Y", "value"), class = "data.frame", row.names = c(NA, -25L))
使用xtabs
作为基数:
xtabs(value~Y+X, df)
# X
#Y 100 6100 12100 18100 24100
# 100 0.216000000 0.001090000 0.008530000 0.019700000 0.000038000
# 6100 0.506000000 0.002310000 0.012500000 0.030600000 0.000033600
# 12100 0.506000000 0.002310000 0.015900000 0.032900000 0.000000393
# 18100 0.506000000 0.002920000 0.016300000 0.000243000 0.000000820
# 24100 0.506000000 0.003220000 0.000182000 0.000190000 0.000005380
使用data.table
和dcast.data.table
:
library(data.table)
dcast(data = setDT(dx),formula = X~Y)
# X 100 6100 12100 18100 24100
# 1: 100 0.216000 5.06e-01 5.06e-01 5.06e-01 5.06e-01
# 2: 6100 0.001090 2.31e-03 2.31e-03 2.92e-03 3.22e-03
# 3: 12100 0.008530 1.25e-02 1.59e-02 1.63e-02 1.82e-04
# 4: 18100 0.019700 3.06e-02 3.29e-02 2.43e-04 1.90e-04
# 5: 24100 0.000038 3.36e-05 3.93e-07 8.20e-07 5.38e-06
您想要从稀疏三元组表示中创建一个24100x24100矩阵(每一行表示矩阵中的一个非零单元格)吗?这可以使用Matrix库来完成:
sp <- read.table(text="100 100 0.216
6100 100 0.00109
12100 100 0.00853
18100 100 0.0197
24100 100 0.000038
100 6100 0.506
6100 6100 0.00231
12100 6100 0.0125
18100 6100 0.0306
24100 6100 3.36E-005
100 12100 0.506
6100 12100 0.00231
12100 12100 0.0159
18100 12100 0.0329
24100 12100 3.93E-007
100 18100 0.506
6100 18100 0.00292
12100 18100 0.0163
18100 18100 0.000243
24100 18100 8.20E-007
100 24100 0.506
6100 24100 0.00322
12100 24100 0.000182
18100 24100 0.00019
24100 24100 5.38E-006")
library(Matrix)
spMat <- spMatrix(24100, 24100, sp[,1], sp[,2], sp[,3])
这是一个稀疏矩阵,这意味着它只为非零单元分配内存:
object.size(spMat)
# 1872 bytes
如果您想避免使用数据帧,您可以使用slam
包中的simple_triplet_matrix
或使用sparseMatrix
函数将SparseM
中的dgTMatrix
类转换为矩阵的三重形式。
从那里,您可以使用as.matrix
,
library(slam)
mat = simple_triplet_matrix(c(1,3,4),c(2,4,5),c(2,4,2))
as.matrix(mat)