所以我有一个数据框,其中包含一堆与项目的交易,有点像这样:
| 1 | 2 | 4 | 5 | 6 |
| 3 | 5 | 8 | 9 | |
| 1 | 5 | 7 | 10 | 12 |
| 7 | 8 | 10 | 15 | 17 |
我有一个所有现有项目的列表,现在我想将其转换为具有 0 和 1 值的逻辑矩阵。因此,如果给定行中存在项目,则矩阵中的该条目应为 1。
是否有捷径可寻?
编辑: 对于逻辑矩阵,我们需要为每个项目生成一列,为每个事务生成一行。
所以我有一个数据框,其中包含一堆与项目的交易,有点像这样:
| 1 | 2 | 4 | 5 | 6 |
| 3 | 5 | 8 | 9 | |
| 1 | 5 | 7 | 10 | 12 |
| 7 | 8 | 10 | 15 | 17 |
我有一个所有现有项目的列表,现在我想将其转换为具有 0 和 1 值的逻辑矩阵。因此,如果给定行中存在项目,则矩阵中的该条目应为 1。
是否有捷径可寻?
编辑: 对于逻辑矩阵,我们需要为每个项目生成一列,为每个事务生成一行。
您可以使用as.logical
.
# for a matrix
apply({m[is.na(m)] <- 0;m}, 2, as.logical)^1
# [,1] [,2] [,3] [,4]
# [1,] 1 1 1 0
# [2,] 0 1 1 1
# [3,] 1 1 0 1
# works too on data frames
apply({d[is.na(d)] <- 0;d}, 2, as.logical)^1
# [,1] [,2] [,3] [,4]
# [1,] 1 1 1 0
# [2,] 0 1 1 1
# [3,] 1 1 0 1
或者,使用更少的字节和@RHertel的信用:
d[] <- +!is.na(d)
数据:
m <- structure(c(1L, NA, 12L, 9L, 2L, 4L, 8L, 6L, NA, NA, 11L, 7L), .Dim = 3:4)
d <- as.data.frame(m)
您可以使用以下代码来制作它:
作为M <- as.matrix(df)
将数据帧转换为矩阵的第一步,然后使用
M[] <- ifelse(!is.na(M>0),1,0)
或者
M[] <- +(!is.na(M>0))
你会得到二进制矩阵M
假设您的数据框被调用df
,您可以执行以下操作:
df_matrix <- as.matrix(df)
df_matrix[!is.na(df_matrix)] <- 1
df_matrix[is.na(df_matrix)] <- 0