R语言矩阵处理技巧【实战】

2021-05-03  本文已影响0人  YERA
pexels-alex-kozlov-7557420.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的介绍,下面是链接:

R-rbind.fill|列数不一致的多个数据集“智能”合并,Get! - 知乎 (zhihu.com)

    让我们一起试试看吧!

> 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函数进行合并,这样行数不一致问题就转化为了列数不一致问题,最后再转置回来!!!

上一篇 下一篇

猜你喜欢

热点阅读