r - 将所有值除以引用行

标签 r matrix dplyr

虽然这看起来类似于 this ,我正在寻找一个“整洁”的解决方案......

让我们看看下面的数据(如果你好奇的话,它是一些化学元素的岩石成分):

# A tibble: 4 x 15
  Rock        La     Ce     Pr     Nd    Sm    Eu    Gd     Tb    Dy     Ho    Er     Tm    Yb     Lu
  <chr>      <dbl>  <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl>  <dbl> <dbl>  <dbl> <dbl>  <dbl>
1 Upper CC  31     63     7.1    27     4.7   1     4     0.7    3.9   0.83   2.3   0.3    1.96  0.31  
2 Middle CC 24     53     5.8    25     4.6   1.4   4     0.7    3.8   0.82   2.3   0.32   2.2   0.4   
3 Lower CC   8     20     2.4    11     2.8   1.1   3.1   0.48   3.1   0.68   1.9   0.24   1.5   0.25  
4 chondrite  0.235  0.603 0.0891  0.452 0.147 0.056 0.197 0.0363 0.243 0.0556 0.159 0.0242 0.162 0.0243

(输出见最后)

这是由三个样本和一个引用值(球粒陨石)组成的。我想通过球粒陨石对每个样本的每个元素的值进行归一化,即得到类似的东西:

# A tibble: 4 x 15
  Rock         La    Ce    Pr    Nd    Sm    Eu    Gd    Tb    Dy    Ho    Er    Tm    Yb    Lu
  <chr>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Upper CC  132.  104.   79.7  59.7  32.0  17.9  20.3  19.3  16.0  14.9  14.5 12.4  12.1   12.8
2 Middle CC 102.   87.9  65.1  55.3  31.3  25    20.3  19.3  15.6  14.8  14.5 13.2  13.6   16.5
3 Lower CC   34.0  33.2  26.9  24.3  19.0  19.6  15.7  13.2  12.8  12.2  12.0  9.92  9.26  10.3
4 chondrite   1     1     1     1     1     1     1     1     1     1     1    1     1      1

当然,其中 df["Upper CC","La"] 的前 132 个来自 31/0.235,即 df["Upper CC","La"]/df["球粒陨石","啦”]

这在 excel 中是微不足道的,可以在普通的 R 中用类似的东西来完成

apply(df[,-1],1,FUN=function(z){return(z/df[4,-1])})

给予或接受一些 unlist() 和其他细节。

但是我如何在 tidyverse idiom 中执行此操作?我开始构建

df %>% mutate(across( where(is.numeric), ... ? .... ) )

...但无法更进一步。

泛化/相关问题:不是通过 df[4,] 进行归一化,而是通过任意命名向量进行归一化。

dput(df)

structure(list(Rock = c("Upper CC", "Middle CC", "Lower CC", 
"chondrite"), La = c(31, 24, 8, 0.2347), Ce = c(63, 53, 20, 0.6032
), Pr = c(7.1, 5.8, 2.4, 0.0891), Nd = c(27, 25, 11, 0.4524), 
    Sm = c(4.7, 4.6, 2.8, 0.1471), Eu = c(1, 1.4, 1.1, 0.056), 
    Gd = c(4, 4, 3.1, 0.1966), Tb = c(0.7, 0.7, 0.48, 0.0363), 
    Dy = c(3.9, 3.8, 3.1, 0.2427), Ho = c(0.83, 0.82, 0.68, 0.0556
    ), Er = c(2.3, 2.3, 1.9, 0.1589), Tm = c(0.3, 0.32, 0.24, 
    0.0242), Yb = c(1.96, 2.2, 1.5, 0.1625), Lu = c(0.31, 0.4, 
    0.25, 0.0243)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"))

最佳答案

你可以使用:

library(dplyr)

df %>% mutate(across(where(is.numeric), ~./.[Rock == "chondrite"]))

#   Rock     La    Ce    Pr    Nd    Sm    Eu    Gd    Tb    Dy
#  <chr>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Upper … 132.  104.   79.7  59.7  32.0  17.9  20.3  19.3  16.1
#2 Middle… 102.   87.9  65.1  55.3  31.3  25.0  20.3  19.3  15.7
#3 Lower …  34.1  33.2  26.9  24.3  19.0  19.6  15.8  13.2  12.8
#4 chondr…   1     1     1     1     1     1     1     1     1  
# … with 5 more variables: Ho <dbl>, Er <dbl>, Tm <dbl>,
#   Yb <dbl>, Lu <dbl>

关于r - 将所有值除以引用行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65306336/

相关文章:

r - 如何将一列(逗号拆分)转换为 R 中的多列?

r - 有没有办法使用 rowwise 以正确的方式获取跨行的平均值?

r - 在 R 中分组和按行自定义排列

r - R中的单向哈希函数

r - 为什么从 rmarkdown 渲染 pdf 需要在渲染之间关闭 rstudio?

java - 在java中构建项目-项目矩阵

algorithm - strassen 的矩阵乘法在哪里有用?

R Shiny 在不同进程中运行任务/脚本

r - R 中用拼写正确的单词替换拼写错误的单词的函数?

c++ - OpenCL 计算与顺序算法的输出不匹配