r - 将所有值除以参考行
问题描述
虽然这看起来与此相似,但我正在寻找一个“整洁”的解决方案......
让我们看一下以下数据(如果您好奇,它是一些化学元素的岩石成分):
# 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["chondrite","La"]
这在 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>
推荐阅读
- flink-cep - 如何理解数据在cep中的存储?
- python-3.x - 使用 pypandoc 将 epub 转换为 html 文件
- javascript - 如何将此 Node.js 结果下载到浏览器?
- javascript - 如何正确检测鼠标右键?
- reactjs - 如何以 redux 形式映射字段选择选项?
- android - Web 应用程序设计在 iphone 和 android/pc 上看起来不同
- vue.js - Vuetify中如何让item-value的值成为路由链接?
- mysql - 从 Google Cloud SQL MySQL 向我的 localhost MySQL 帐户授予所有权限,以便我可以将本地数据库迁移到云端
- python - 对参加高级 CS 课程的 Python 初学者(非 CS)的建议(需要良好的 Python 知识)
- c++ - 使用 sanitize=vptr 时对“__dynamic_cast”的未定义引用