满足 R 中的条件时从另一个数据帧计算 z 分数

Calculate z-score from another dataframe when meeting conditions in R

我有两个数据框:

Node1<-c(1, 2, 3, 4, 5, 6, 7)
Node1<-c(1, 1, 1, 2, 2, 3)
Node2<-c(2, 3, 4, 3, 4, 4)
Mean<-c(2, 1, 5, 3, 2, 3)
SD<-c(0.1, 0.2, 0.01, 0.2, 0.01, 0.01)
df1<-data.frame(Node1, Node2, Mean, SD)
df1
  Node1 Node2 Mean   SD
1     1     2    2 0.10
2     1     3    1 0.20
3     1     4    5 0.01
4     2     3    3 0.20
5     2     4    2 0.01
6     3     4    3 0.01

df2<-data.frame(Node1, Node2, value)
df2
  Node1 Node2 value
1     1     2     1
2     1     3     2
3     1     4     1
4     2     3     4
5     2     4     6
6     3     4     7

对于 df2 中的每个“值”行,我想使用 df1 中相应节点对(即节点 1 和节点 2)的均值和标准差 (SD) 作为参考值来计算 z 分数。例如,对于 df2 的第一行,z 分数应为 ((1-2)/0.10),因为相应的平均值和 SD 是通过匹配来自两个 dfs 的 Node1 和 Node2 值得出的。

如何在 R 中执行此操作?我目前的解决方案是使用 left_join 组合 df1 和 df2,然后使用 mutatecase_when 但我无法超越这个来提取 z 分数,同时保留特定条件(即, 同时匹配来自两个 dfs 的 Node1 和 Node2 值)

我认为你可以这样做:

left_join(df1, df2, by = c('Node1', 'Node2')) %>%
  mutate(z_score = (Mean - value) / SD)
#>   Node1 Node2 Mean   SD value z_score
#> 1     1     2    2 0.10     1      10
#> 2     1     3    1 0.20     2      -5
#> 3     1     4    5 0.01     1     400
#> 4     2     3    3 0.20     4      -5
#> 5     2     4    2 0.01     6    -400
#> 6     3     4    3 0.01     7    -400