我有一个矩阵
set.seed(1)
m <- matrix(sample(-1:1,30,replace = T,prob = c(1,5,1)),
ncol = 3, dimnames = list(NULL, LETTERS[1:3]))
...
m
A B C
[1,] 0 0 -1
[2,] 0 0 0
[3,] 0 0 0
[4,] -1 0 0
[5,] 0 1 0
[6,] -1 0 0
[7,] -1 1 0
[8,] 0 -1 0
[9,] 0 0 -1
[10,] 0 1 0
我需要找到非重复序列(非重复序列是rle算法的作用)
并将其转换为长格式,如下所示:
id name val
1 3 A 0
2 4 A -1
3 5 A 0
4 7 A -1
5 10 A 0
6 4 B 0
7 5 B 1
8 6 B 0
9 7 B 1
10 8 B -1
11 9 B 0
12 10 B 1
13 1 C -1
14 8 C 0
15 9 C -1
16 10 C 0
我写了一些代码,但对我来说很慢.我的代码运行在小数据上~2000行和5列,但它运行了几十万次. 我在寻找最有效的解决办法
以下是我的代码:
rid <- apply(m, 2, \(colum) cumsum(rle(colum)$length))
long_df <- NULL
for(Name in names(rid)){
df <- cbind.data.frame(id = rid[[Name]],
name = Name,
val = m[rid[[Name]],Name])
long_df <- rbind.data.frame(long_df, df)
}
long_df
Unit: milliseconds
expr min lq mean median uq max neval
my_fu(m) 3.3196 3.6157 4.293507 3.75735 4.0036 12.2766 30
MrFlick_fu(m) 25.6869 26.5682 31.062887 27.22125 34.3767 60.2749 30
one_fu(m) 3.0693 3.3389 3.507363 3.51300 3.6304 4.1176 30
jblood94_fu(m) 1.3574 1.4510 1.621113 1.50865 1.5659 3.7355 30
jblood94_2_fu(m) 1.0156 1.0660 1.197143 1.12360 1.2961 1.7586 30