0

所以我有一个数据框,其中包含一堆与项目的交易,有点像这样:

| 1 | 2 | 4  | 5  | 6  |
| 3 | 5 | 8  | 9  |    |
| 1 | 5 | 7  | 10 | 12 |
| 7 | 8 | 10 | 15 | 17 |

我有一个所有现有项目的列表,现在我想将其转换为具有 0 和 1 值的逻辑矩阵。因此,如果给定行中存在项目,则矩阵中的该条目应为 1。

是否有捷径可寻?

编辑: 对于逻辑矩阵,我们需要为每个项目生成一列,为每个事务生成一行。

4

3 回答 3

3

您可以使用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)
于 2020-01-16T15:24:07.087 回答
1

您可以使用以下代码来制作它:

作为M <- as.matrix(df)将数据帧转换为矩阵的第一步,然后使用

M[] <- ifelse(!is.na(M>0),1,0)

或者

M[] <- +(!is.na(M>0))

你会得到二进制矩阵M

于 2020-01-16T15:30:26.360 回答
0

假设您的数据框被调用df,您可以执行以下操作:

df_matrix <- as.matrix(df)
df_matrix[!is.na(df_matrix)] <- 1
df_matrix[is.na(df_matrix)] <- 0
于 2020-01-16T15:22:05.413 回答