我有一个大矩阵:
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可以使用,但我想要一种更快的方法来执行此操作.
我试图使用这一行对数据帧的每一行进行排序,
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)
有什么建议?谢谢
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)
但它的做事方式似乎很慢。
我正在寻找一种解决方案,将新列添加到现有数据框/数据表中,这是每个单独行中的第 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)