![](https://img.haomeiwen.com/i21334572/25615231af55af3d.jpg)
矩阵是R语言中比较重要的数据类型,熟练地处理矩阵是数据分析实战中必不可少的过程。这篇文章整理了一些我在做项目过程中遇到的R语言矩阵处理技巧,希望能够帮到大家。
1. 对矩阵的每一行或列循环,但是又不想改变提取的每一行或列的矩阵类型【drop=F】
A <- matrix(1:4,nrow = 2)
A
[,1] [,2]
[1,] 1 3
[2,] 2 4
C = A[,1]
C
[1] 1 2
B = A[,1,drop=F]
B
[,1]
[1,] 1
[2,] 2
主要就是在矩阵的索引时,在参数列表里加入drop=F,即可按照矩阵的方式索引出相应元素。
2. 对矩阵或数据框指定几行或列求和,而不采用自编函数【Reduce】
A <- data.frame(permutations(3))
A
X1 X2 X3
1 1 2 3
2 2 1 3
3 2 3 1
4 1 3 2
5 3 1 2
6 3 2 1
Reduce("+",A[,1:2])
[1] 3 3 5 4 4 5
Reduce("+",A[,1:3],accumulate = T)
[[1]]
[1] 1 2 2 1 3 3
[[2]]
[1] 3 3 5 4 4 5
[[3]]
[1] 6 6 6 6 6 6
其中permuations函数是1到指定输入参数所有的组合,比如3就有6种排列组合,另外实现指定行求和的函数是Reduce,记住”R“要大写!他可以指定列求和,同时还可以对指定的列累计求和,并以列表的方式输出每次的结果。在编写Mann-Whitney统计量原理的时候经常涉及到。
3.行数不一致的多个数据集按列合并【cbind.fill函数】
cbind.fill <- function(...){
nm <- list(...)
nm <- lapply(nm, as.matrix)
n <- max(sapply(nm, nrow))
do.call(cbind, lapply(nm, function (x)
rbind(x,matrix(,n-nrow(x), ncol(x)))))
}
我利用了自编函数,创建了一个类似于rbind.fill的函数,这个rbind.fill函数是plyr包里面针对不同长度的行合并,具体可以看知乎博主西游东行对rbind.fill的介绍,下面是链接:
让我们一起试试看吧!
> A <- data.frame(permutations(2))
> A
X1 X2
1 1 2
2 2 1
> B <- data.frame(permutations(3))
> B
X1 X2 X3
1 1 2 3
2 2 1 3
3 2 3 1
4 1 3 2
5 3 1 2
6 3 2 1
> C <- cbind.fill(A,B)
> C
X1 X2 X1 X2 X3
[1,] 1 2 1 2 3
[2,] 2 1 2 1 3
[3,] NA NA 2 3 1
[4,] NA NA 1 3 2
[5,] NA NA 3 1 2
[6,] NA NA 3 2 1
突然灵光乍现!!我们可以将待合并的数据集做转置,再利用现成的rbind.fill函数进行合并,这样行数不一致问题就转化为了列数不一致问题,最后再转置回来!!!
网友评论