我需要将数据框中的值(基于特定分组)乘以一个单独的矩阵,该矩阵对这些值施加某种权重.乘法是我写的一个函数的一部分.我知道如何以最基本的方式做到这一点.但我不明白如何才能在更现实的环境中做到这一点.我希望我的例子能清楚地说明这个问题.
我有以下示例数据集:
set.seed(45)
tibble(site = rep(c(LETTERS[1:3]), each = 6),
name = rep(c(letters[10:15]), 3),
size = runif(18)) %>%
arrange(site, name) -> d_tibble
我还有一个可以表示某种权重的矩阵:
d_matrix <- matrix(0, 6, 6)
diag(d_matrix) <- 1
rownames(d_matrix) <- letters[10:15]
colnames(d_matrix) <- letters[10:15]
d_matrix
## j k l m n o
## j 1 0 0 0 0 0
## k 0 1 0 0 0 0
## l 0 0 1 0 0 0
## m 0 0 0 1 0 0
## n 0 0 0 0 1 0
## o 0 0 0 0 0 1
我还有一个函数,应该是将向量p
乘以矩阵b
test_fct <- function(a, b) {
p <- a / sum(a)
sum(p * (p %*% b))
}
然后我想做这样的事情,即在summarise()
中使用我的函数:
#d_tibble %>%
# group_by(site) %>%
# summarise(y = test_fct(size, b))
但我不知道如何将b
,即矩阵,放入我的定制函数中,以便当按site
分组时,它的列名与name
变量相匹配.
我try 的一种方法是将矩阵合并到数据框中-这样我就可以将所有东西都放在一个数据框中:
d_tibble %>%
left_join(d_matrix %>%
as_tibble() %>%
mutate(name = colnames(d_matrix))) -> tibble_matrix_join
但我需要以某种方式访问给定site
分组的name
变量的唯一值,以便为我的函数test_fct()
中的向量/矩阵乘法 Select 正确的列(j,k,l,m,n,o):
#tibble_matrix_join %>%
# group_by(site) %>%
# summarise(result = test_fct(size, b))
我试着判断一般设置是否有效,即只针对一个站点,并将所有名称都包括在矩阵中,它确实有效:
d_tibble %>%
filter(site == "A") %>%
pull(size) -> my_x
test_fct(my_x, d_matrix)
## [1] 0.1858158
my_p <- my_x/sum(my_x)
sum(my_p * (my_p %*% d_matrix))
## [1] 0.1858158