我需要将数据框中的值(基于特定分组)乘以一个单独的矩阵,该矩阵对这些值施加某种权重.乘法是我写的一个函数的一部分.我知道如何以最基本的方式做到这一点.但我不明白如何才能在更现实的环境中做到这一点.我希望我的例子能清楚地说明这个问题.

我有以下示例数据集:

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

推荐答案

在本例中,d_Matrix中的所有列都位于所有站点的Tibble的‘name’列中.如果不是这样,我们可以这样做

library(dplyr)
d_tibble %>%
   group_by(site) %>% 
   summarise(out = test_fct(size, d_matrix[intersect(row.names(d_matrix), 
         name), intersect(colnames(d_matrix), 
         name), drop = FALSE]), .groups = "drop")

-输出

# A tibble: 3 × 2
  site    out
  <chr> <dbl>
1 A     0.186
2 B     0.264
3 C     0.218

-测试较小的数据

d_tibble %>% 
  slice_sample(n = 12) %>%
  arrange(site, name) %>% 
  group_by(site) %>% 
   summarise(out = test_fct(size, d_matrix[intersect(row.names(d_matrix), 
         name), intersect(colnames(d_matrix), 
         name), drop = FALSE]), .groups = "drop")

-输出

# A tibble: 3 × 2
  site    out
  <chr> <dbl>
1 A     0.227
2 B     0.416
3 C     0.481

R相关问答推荐

如何创建构成多个独立列条目列表的收件箱框列?

以R为基数排列奇数个图

编码变量a、b、c以匹配来自另一个数据点的变量x

如何在R中添加截止点到ROC曲线图?

修改用R编写的用户定义函数

在特定Quarto(reveal.js)幻灯片上隐藏徽标

然后根据不同的列值有条件地执行函数

在连续尺度上转置标签[瀑布图,R]

plotly hover文本/工具提示在shiny 中不起作用

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

观察器中的inaliateLater的位置

如何将这个小列表转换为数据帧?

创建新列,其中S列的值取决于该行S值是否与其他行冗余

名字的模糊匹配

R中的Desolve:返回的导数数错误

如果满足条件,则替换列的前一个值和后续值

禁用时,SelecizeInput将变得不透明

条形图中的条形图没有try 赋予它们的 colored颜色

当y为负值时,无法使stat_cor正确定位到底部?

我应该如何解决Raster程序包中未对齐的色条记号?