1

这是我的示例数据:

    Name       Value
1   Tom         4
2   Dave        2
3   Frank       3
4   Frank       1
5   Dave        1
6   Tom         1
7   Ri          4
8   Ri          5

我需要上述数据采用以下格式

#   Tom   Dave  Frank    Ri
1    1      1     1    0
2    0      1     0    0
3    0      0     1    0
4    1      0     0    1 
5    0      0     0    1

如果将代码获取为所需的数据格式。请确保我将将此代码用于我的 big_data,它有 1048576 行和 2 列。

4

1 回答 1

4

这有效:

all_names <- unique(df$Name)
num_cols  <- length(all_names)
num_rows  <- max(df$Value)

mat <- matrix(0L, num_rows, num_cols,
              dimnames = list(NULL, all_names))
mat[cbind(df$Value, match(df$Name, all_names))] <- 1L
mat
#      Tom Dave Frank Ri
# [1,]   1    1     1  0
# [2,]   0    1     0  0
# [3,]   0    0     1  0
# [4,]   1    0     0  1
# [5,]   0    0     0  1

我关于矩阵有多稀疏的问题并不是无辜的。如果它非常稀疏,您有兴趣使用稀疏矩阵,因为它将使用更少的内存:

library(Matrix)
mat <- sparseMatrix(i = df$Value, j = match(df$Name, all_names), x = 1L,
                    dimnames = list(NULL, all_names))
于 2013-11-13T04:02:16.800 回答