如何在R中的矩阵中添加重复值

时间:2015-06-09 20:34:18

标签: r

从此样本矩阵开始:

 my.matrix <- cbind(c('a','b','c','a','d','a','e','f','g','h','a'), c(1,1,1,1,2,2,2,2,3,4,4))
 my.matrix
         [,1] [,2]
 [1,] "a"  "1" 
 [2,] "b"  "1" 
 [3,] "c"  "1" 
 [4,] "a"  "1" 
 [5,] "d"  "2" 
 [6,] "a"  "2" 
 [7,] "e"  "2" 
 [8,] "f"  "2" 
 [9,] "g"  "3" 
 [10,] "h"  "4" 
 [11,] "a"  "4" 

有没有办法添加每个重复字母的数值?所以最终结果将是:

cbind(c('a','b','c','d','e','f','g','h'), c(7,1,1,2,2,2,3,4))
    [,1] [,2]
[1,] "a"  "7" 
[2,] "b"  "1" 
[3,] "c"  "1" 
[4,] "d"  "2" 
[5,] "e"  "2" 
[6,] "f"  "2" 
[7,] "g"  "3" 
[8,] "h"  "4" 

3 个答案:

答案 0 :(得分:1)

您可以使用tapply

> tapply(as.numeric(my.matrix[, 2]), my.matrix[, 1], sum)
a b c d e f g h 
8 1 1 2 2 2 3 4 

注意,在这种情况下,使用数据帧而不是矩阵可能更有意义,因为列是不同的类型。此外,您的示例答案似乎是错误的。

如果你真的想要一个矩阵作为结果,你可以cbind上面的结果名称和值。

答案 1 :(得分:1)

在矩阵中包含混合类型的数据并不是一个好主意。将内容存储在data.frame中会更容易,然后您可以使用aggregate来折叠和汇总数据

my.data <- data.frame(
     a=c('a','b','c','a','d','a','e','f','g','h','a'),
     b=c(1,1,1,1,2,2,2,2,3,4,4)
)

aggregate(b~a, my.data, sum)

返回

  a b
1 a 8
2 b 1
3 c 1
4 d 2
5 e 2
6 f 2
7 g 3
8 h 4

答案 2 :(得分:0)

除了使用基础R的其他优秀答案之外,您还可以考虑使用dplyr包的方法。

library(dplyr)

# Use a data frame rather than a matrix
my.data <- data.frame(x = c('a', 'b', 'c', 'a', 'd', 'a', 'e', 'f', 'g', 'h', 'a'),
                      y = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4))

my.data %>%
    group_by(x) %>%
    summarize(count = sum(y))

#   x count
# 1 a     8
# 2 b     1
# 3 c     1
# 4 d     2
# 5 e     2
# 6 f     2
# 7 g     3
# 8 h     4

请注意,正如Flick先生所说,当你有混合数据类型时,你应该使用数据框而不是矩阵。