【问题标题】:Sum of digits in a numeric matrix per row每行数字矩阵中的数字总和
【发布时间】:2017-11-03 19:11:50
【问题描述】:

有一个像这样的矩阵:

        [,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 之间的行,那么 必须返回值为 38 的行 2

【问题讨论】:

标签: r matrix sum


【解决方案1】:

我们可以的

 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)

【讨论】:

  • 当我看到你的回答时,我明白了他的问题,很好的解决方案:)
【解决方案2】:

你可以这样做:

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 中的所有数字的位数不相等(对于您的情况,它是2

  • 然后你使所有列表元素的长度相等(通过添加NA)并从列表元素中得到一个矩阵,其中rowSums 为您提供m 中每行的数字总和

  • 一旦获得数字的行和(即res),您就可以过滤掉那些感兴趣的行。

【讨论】:

    猜你喜欢
    • 2018-01-29
    • 1970-01-01
    • 2021-12-28
    • 2012-05-09
    • 1970-01-01
    • 2016-05-02
    • 2020-04-13
    相关资源
    最近更新 更多