相关疑难解决方法(0)

在R中对大型矩阵的每一行进行排序的最快方法

我有一个大矩阵:

set.seed(1)
a <- matrix(runif(9e+07),ncol=300)
Run Code Online (Sandbox Code Playgroud)

我想对矩阵中的每一行进行排序:

> system.time(sorted <- t(apply(a,1,sort)))
   user  system elapsed 
  42.48    3.40   45.88 
Run Code Online (Sandbox Code Playgroud)

我有很多RAM可以使用,但我想要一种更快的方法来执行此操作.

sorting row r matrix

8
推荐指数
3
解决办法
2810
查看次数

对数据框的每一行进行排序

我试图使用这一行对数据帧的每一行进行排序,

sapply(df, function(x) sort(x))
Run Code Online (Sandbox Code Playgroud)

但是,列正在排序而不是行.

例如,此数据框

5          10          7          1          5
6           3          9          2          4
4           5          1          3          3
Run Code Online (Sandbox Code Playgroud)

最终是这样的:

4           3          1          1          3
5           5          7          2          4
6          10          9          3          5
Run Code Online (Sandbox Code Playgroud)

我想要这个:

1 5 5 7 10
2 3 4 6 9
1 3 3 4 5
Run Code Online (Sandbox Code Playgroud)

有什么建议?谢谢

sorting r

7
推荐指数
2
解决办法
9785
查看次数

如何对data.table中的每一行进行排序?

data.table在每一行中对值进行排序的方式是什么?我可以轻松地编写一个循环来逐行进行排序,但我认为这不是一种非常聪明的做事方式。

例子:

来个赞吧data.table

df = data.table(ID = c('a', 'b', 'c', 'd', 'e', 'f'),
                v1 = c(1,2,1,3,4,5),
                v2 = c(2,3,6,1,0,2),
                v3 = c(0,0,1,2,3,5))
Run Code Online (Sandbox Code Playgroud)

我可以使用for loop类似这样的方式对此进行排序:

for (i in 1:nrow(df))
{
  df[i, 2:4] = sort(df[i, 2:4], decreasing = T)
}
Run Code Online (Sandbox Code Playgroud)

它给出了预期的结果:

   ID v1 v2 v3
1:  a  2  1  0
2:  b  3  2  0
3:  c  6  1  1
4:  d  3  2  1
5:  e  4  3  0
6:  f  5  5  2
Run Code Online (Sandbox Code Playgroud)

但它的做事方式似乎很慢。

r data.table

5
推荐指数
1
解决办法
348
查看次数

从行中选择第 i 个最大值并分配给新列的最快方法

我正在寻找一种解决方案,将新列添加到现有数据框/数据表中,这是每个单独行中的第 i 个最高值。例如,如果我想要第 4 个最高值,则新列的第一行将包含 1.9。

data <- data.frame(a = c("a","a","b","b","c","a"),
                   peak1 = c(1.1,2.5,2.4,2.1,2.5,2.6),
                   peak2 = c(1.2,2.5,2.4,2.1,2.5,2.6),
                   peak3 = c(1.3,2.5,2.4,2.1,2.5,2.6),
                   peak4 = c(1.4,2.5,2.5,2.1,2.5,2.6),
                   peak5 = c(1.5,2.5,2.46,2.1,2.5,2.6),
                   peak6 = c(1.6,2.5,2.4,2.1,2.5,2.6),
                   peak7 = c(1.7,2.5,2.4,2.1,2.5,2.0),
                   peak8 = c(1.8,2.5,2.4,2.1,2.5,2.1),
                   peak9 = c(1.9,2.2,2.4,2.1,2.5,2.2),
                   peak10 = c(2,2.5,2.4,2.1,2.5,2.3),
                   peak11 = c(2.1,2.5,2.4,2.1,2.5,2.4),
                   peak12 = c(2.2,2.5,2.4,2.99,3,2.5))
Run Code Online (Sandbox Code Playgroud)

我已经尝试添加一个索引列,然后使用 lapply 函数选择值,但它在每个单元格中返回一个列表,并且在具有 ~3.000.000 条记录的真实数据集上运行速度非常慢。理想情况下,我正在寻找一种可以在几秒钟内解决此问题的解决方案,因为它运行良好。

data$index <- lapply(split(data[,c(-1)],seq(nrow(data))),FUN = order, decreasing = TRUE)
rank <- 4
data$result <- lapply(1:nrow(data), function(row) data[row, data$test[[row]][rank]+1])
Run Code Online (Sandbox Code Playgroud)

r

2
推荐指数
1
解决办法
198
查看次数

标签 统计

r ×4

sorting ×2

data.table ×1

matrix ×1

row ×1