我正在try 进行过滤,以便一旦从矩阵顶部开始找到一对数字中的唯一数字,任何后续的对条目都会从矩阵中删除,只留下过滤后的数据.

T_data = c(7,9,8,10,2,10,5,9,1,8,2,1,4,7,5,4,2,5)

T_new = matrix(T_data,ncol=2,byrow=TRUE)

所需输出: 7 9、8 10、2 1、5 4

# Desired output
> matrix(c(7, 9, 8, 10, 2, 1, 5, 4), ncol = 2, byrow = TRUE)
     [,1] [,2]
[1,]    7    9
[2,]    8   10
[3,]    2    1
[4,]    5    4

我try 过编写自己的循环,但我认为有一种简单的方法可以在R中做到这一点?

推荐答案

通过精心设计的for循环,您可能会获得最佳性能:

uniquemat <- function(x) {
  y <- array(match(c(x), u <- unique(c(x))), dim(x))
  u <- logical(length(u))
  k <- logical(nrow(x))
  u[y[1,]] <- k[1] <- TRUE
  for (i in 2:nrow(x)) if (!any(u[y[i,]])) u[y[i,]] <- k[i] <- TRUE
  x[k,]
}

uniquemat(T_data)
#>      [,1] [,2]
#> [1,]    7    9
#> [2,]    8   10
#> [3,]    2    1
#> [4,]    5    4

使用更大的数据集进行基准测试:

fReduce <- function(x) { # from SamR
  Reduce(\(x,y) 
         if(any(x %in% y)) x else c(x, y), 
         asplit(x, 1)
  ) |> matrix(ncol = ncol(x), byrow = TRUE)
}

T_data <- matrix(sample(1e4, 1e4, 1), ncol = 2)

bench::mark(
  uniquemat = uniquemat(T_data),
  fReduce = fReduce(T_data)
)
#> # A tibble: 2 × 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 uniquemat     4.3ms   4.68ms    191.       570KB     29.8
#> 2 fReduce     274.2ms 274.88ms      3.64     201MB     18.2

对于大型矩阵来说,以这种方式使用Reduce变得非常慢,因为x迭代增长,即which is bad.对具有10万行的矩阵进行最终性能判断:

T_data <- matrix(sample(1e5, 1e5, 1), ncol = 2)

bench::mark(
  uniquemat = uniquemat(T_data),
  fReduce = fReduce(T_data)
)
#> # A tibble: 2 × 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 uniquemat    86.5ms   99.8ms    7.41      5.18MB     14.8
#> 2 fReduce         24s      24s    0.0416   19.53GB     10.5

R相关问答推荐

给定R中另一行中的值,如何插补缺失值

是否可以 Select 安装不带文档的R包以更有效地存储?

在垂直轴中包含多个ggplot2图中的平均值

迭代通过1个长度的字符串长字符R

在R中使用数据集名称

R-更新面内部的栅格值

将包含卷的底部25%的组拆分为2行

多个过滤器内的一个盒子在仪表板Quarto

R—将各种CSV数字列转换为日期

R中的时间序列(Ts)函数计数不正确

如何使用tryCatch执行语句并忽略警告?

具有重复元素的维恩图

按两个因素将观测值分组后计算单独的百分比

构建一个6/49彩票模拟系统

R-找出存在其他变量的各种大小的所有组合

在同一单元格中创建包含整数和百分比的交叉表

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误

使用一个标签共享多个组图图例符号

将R中对象的CSV数组转换为JSON数组

在使用ggplot2的情况下,如何在使用coord_trans函数的同时,根据未转换的坐标比来定位geom_瓷砖?