从此样本矩阵开始:
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"
答案 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先生所说,当你有混合数据类型时,你应该使用数据框而不是矩阵。