R:根据数据矩阵和阈值数据框创建 boolean 矩阵

标签 r matrix boolean threshold

假设我有一个像这样的数据矩阵:

> data(mtcars)
> my_mat <- as.matrix(mtcars[,1:7])
> head(my_mat)
                   mpg cyl disp  hp drat    wt  qsec
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02
Datsun 710        22.8   4  108  93 3.85 2.320 18.61
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02
Valiant           18.1   6  225 105 2.76 3.460 20.22

...以及如下所示的阈值数据框,其中包含上面矩阵中某些列的阈值:

> threshold_df <- data.frame(marker=colnames(my_mat)[c(3,4,6)], threshold=apply(my_mat[,c(3,4,6)], 2, quantile, 0.75))
> threshold_df
     marker threshold
disp   disp    326.00
hp       hp    180.00
wt       wt      3.61

有了这些信息,我想最终得到一个由 0 和 1 组成的矩阵,与 my_mat 相同,其中除了高于阈值的列值之外,所有内容均为 0该栏。

到目前为止,我已经有了全 0 矩阵,但不确定如何根据上述信息填充 1...有任何线索吗?谢谢!

> zero_mat <- matrix(0, nrow = nrow(my_mat), ncol = ncol(my_mat))
> colnames(zero_mat) <- colnames(my_mat)
> rownames(zero_mat) <- rownames(my_mat)
> head(zero_mat)
                  mpg cyl disp hp drat wt qsec
Mazda RX4           0   0    0  0    0  0    0
Mazda RX4 Wag       0   0    0  0    0  0    0
Datsun 710          0   0    0  0    0  0    0
Hornet 4 Drive      0   0    0  0    0  0    0
Hornet Sportabout   0   0    0  0    0  0    0
Valiant             0   0    0  0    0  0    0

最佳答案

另一个基本 R 选项

u <- with(threshold_df, mapply(`>`, as.data.frame(my_mat[, marker]), threshold))
my_mat <- 0 * my_mat
my_mat[, colnames(u)] <- u

给出

> my_mat
                    mpg cyl disp hp drat wt qsec
Mazda RX4             0   0    0  0    0  0    0
Mazda RX4 Wag         0   0    0  0    0  0    0
Datsun 710            0   0    0  0    0  0    0
Hornet 4 Drive        0   0    0  0    0  0    0
Hornet Sportabout     0   0    1  0    0  0    0
Valiant               0   0    0  0    0  0    0
Duster 360            0   0    1  1    0  0    0
Merc 240D             0   0    0  0    0  0    0
Merc 230              0   0    0  0    0  0    0
Merc 280              0   0    0  0    0  0    0
Merc 280C             0   0    0  0    0  0    0
Merc 450SE            0   0    0  0    0  1    0
Merc 450SL            0   0    0  0    0  1    0
Merc 450SLC           0   0    0  0    0  1    0
Cadillac Fleetwood    0   0    1  1    0  1    0
Lincoln Continental   0   0    1  1    0  1    0
Chrysler Imperial     0   0    1  1    0  1    0
Fiat 128              0   0    0  0    0  0    0
Honda Civic           0   0    0  0    0  0    0
Toyota Corolla        0   0    0  0    0  0    0
Toyota Corona         0   0    0  0    0  0    0
Dodge Challenger      0   0    0  0    0  0    0
AMC Javelin           0   0    0  0    0  0    0
Camaro Z28            0   0    1  1    0  1    0
Pontiac Firebird      0   0    1  0    0  1    0
Fiat X1-9             0   0    0  0    0  0    0
Porsche 914-2         0   0    0  0    0  0    0
Lotus Europa          0   0    0  0    0  0    0
Ford Pantera L        0   0    1  1    0  0    0
Ferrari Dino          0   0    0  0    0  0    0
Maserati Bora         0   0    0  1    0  0    0
Volvo 142E            0   0    0  0    0  0    0

关于R:根据数据矩阵和阈值数据框创建 boolean 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68724560/

相关文章:

r - gsub中的正则表达式问题

ruby - 在 Ruby 中打印可读矩阵

c++ - OpenCV:与包含 Vec3d 的矩阵和包含 double 的矩阵的矩阵乘法

java - 简化代码 - 检查字符串中的第一个字符以匹配字符列表

java - 将 R 函数作为 Java 方法参数传递

r - tidyselect 更改了在 R 中选择函数时如何引用变量名称的外部向量

R Markdown : add header under tabset

c++ - 带有 std::array 的矩阵类

Python - 函数返回值

ruby 为什么0 || 1 是 0