【问题标题】:How do I convert a data frame into a binary/logical matrix in R? [closed]如何将数据帧转换为 R 中的二进制/逻辑矩阵? [关闭]
【发布时间】:2020-01-16 15:14:45
【问题描述】:

所以我有一个数据框,其中包含一堆物品交易,有点像这样:

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

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

有没有简单的方法可以做到这一点?

编辑: 对于逻辑矩阵,我们需要为每一项生成一列,为每笔交易生成一行。

【问题讨论】:

  • 你如何定义存在?
  • 存在是指它存在于该特定行中。行中有不同数量的项目,但项目编号与列索引不对应。
  • 尝试tidyr:gather整理数据,然后table()

标签: r dataframe matrix binary-matrix


【解决方案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)

【讨论】:

  • 代码高尔夫版本:d[] &lt;- +!is.na(d)。无论如何,apply 循环在这里似乎是不必要的。
  • @RHertel 很好,我已将其添加到我的答案中。
【解决方案2】:

你可以使用下面的代码来制作:

给定M &lt;- as.matrix(df)作为第一步将数据框转换为矩阵,然后使用

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

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

你会得到二进制矩阵M

【讨论】:

    【解决方案3】:

    假设你的数据框叫做df,你可以这样做:

    df_matrix <- as.matrix(df)
    df_matrix[!is.na(df_matrix)] <- 1
    df_matrix[is.na(df_matrix)] <- 0
    

    【讨论】:

    • 谢谢!问题是我的数据框没有每个现有项目的列。每行仅包含该事务中实际存在的项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多