每行数字矩阵中的数字总和

时间:2017-06-02 11:29:03

标签: r matrix sum

有一个矩阵,如:

        [,1] [,2] [,3] [,4] [,5] [,6]
   [1,]   11   14   17   20   23   26
   [2,]   12   15   18   21   24   27
   [3,]   13   16   19   22   25   28

我想只获得2之间每行的数字总和的行    值。

每行的位数总和:

   [1] 30
   [2] 38
   [3] 42

所以,如果我只想获得位数在3140之间的行,那么    只返回值为2的行38

2 个答案:

答案 0 :(得分:3)

我们可以做到

 i1 <-  apply(m1, 1, function(x) {
         v1 <- sum(unlist(lapply(strsplit(as.character(x), ""), as.numeric)))
         v1 > 31 & v1 < 40})

m1[i1, , drop = FALSE]
#   [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]   12   15   18   21   24   27

i1 <- sapply(strsplit(do.call(paste0, as.data.frame(m1)), ""), 
               function(x) sum(as.integer(x)))
m1[i1, , drop = FALSE]

或者我们可以做到

f1 <-  Vectorize(function(x) sum(floor(x / 10^(0:(nchar(x) - 1))) %% 10))
i1 <-  rowSums(t(apply(m1, 1, f1))) %in% 31:40
m1[i1, , drop = FALSE]

数据

m1 <- matrix(11:28, nrow = 3)

答案 1 :(得分:0)

你可以这样做:

l <- strsplit(as.character(t(m)), "")
mx <- max(lengths(l))
res <- rowSums(matrix(as.numeric(unlist(lapply(l, 'length<-', mx))), 
              ncol = ncol(m)*mx, byrow = TRUE), na.rm = TRUE)
m[res>31 & res<42,]

#[1] 12 15 18 21 24 27
  • lm
  • 中所有数字的列表
  • mxm中数字的最大长度,以防m内所有数字的位数不相等(对于您的情况,它是{ {1}})

  • 然后你创建所有相等长度的列表元素(通过添加2)并从列表元素中获取矩阵,其中NA给出{{1}中每行的数字总和}}

  • 一旦获得了数字的行总和(即rowSums),就会过滤掉那些感兴趣的行。