有一个矩阵,如:
[,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
所以,如果我只想获得位数在31
和40
之间的行,那么
只返回值为2
的行38
。
答案 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
l
是m
mx
是m
中数字的最大长度,以防m
内所有数字的位数不相等(对于您的情况,它是{ {1}})
然后你创建所有相等长度的列表元素(通过添加2
)并从列表元素中获取矩阵,其中NA
给出{{1}中每行的数字总和}}
rowSums
),就会过滤掉那些感兴趣的行。