r - 根据另一列减去两个数据框中的列
问题描述
我的第一个数据集(MSdata1)看起来像这样
m.z Intensity Relative Delta..ppm. RDB.equiv. Composition
301.14093 7646 100.00 -0.34 5.5 C16 H22 O4 Na
149.02331 4083458.5 23.60 -0.08 6.5 C8 H5 O3
279.15908 33256 18.64 -0.03 5.5 C16 H23 O4
我的第二个数据集(MSdata2)看起来像这样
m.z Intensity Relative Delta..ppm. RDB.equiv. Composition
331.11233 4324 94.00 -0.33 6.5 C17 H26 O5 Na
149.02331 4083458.5 23.60 -0.08 6.5 C8 H5 O3
279.15908 42315 18.64 -0.03 5.5 C16 H23 O4
我试图根据每行的“ID”减去 $Intensity 列中的两个数据集,即 $Composition 列。(MSdata2$Intensity 减去 MSdata1$Intensity)
我的尝试是
!(data33$Composition %in% data3$Composition)
但是这个及其变体要么给我 TRUE/FALSE 输出,要么不幸地减去所有内容,这不是我的最终目标。我发现了类似的问题,但它们要么不处理字符串——要么它们的两个数据集的大小和内容非常相似。我的两个数据集将有很多不同的信息,并且自始至终具有相似性——我想减去这些相似性以更好地理解它们的差异。
也就是说,
m.z Intensity Relative Delta..ppm. RDB.equiv. Composition
301.14093 -7646 100.00 -0.34 5.5 C16 H22 O4 Na
149.02331 0 23.60 -0.08 6.5 C8 H5 O3
279.15908 9059 18.64 -0.03 5.5 C16 H23 O4
感谢您提供的任何帮助!:(
编辑 - 我更改了我的输出,以便在第一个数据集中找不到 $Composition 字符串,导致输出为负(例如,0-100 = -100)
解决方案
我建议使用dplyr::left_join
with by="Composition"
。根据他所表达的预期输出,OP
他似乎有兴趣MSdata1
从MSdata2
library(dplyr)
MSdata2 %>% left_join(select(MSdata1, Intensity, Composition), by="Composition") %>%
mutate(Intensity = ifelse(is.na(Intensity.y), Intensity.x, Intensity.x - Intensity.y)) %>%
select(-Intensity.y, -Intensity.x )
# m.z Relative Delta..ppm. RDB.equiv. Composition Intensity
# 1 331.1123 94.00 -0.33 6.5 C17 H26 O5 Na 4324
# 2 149.0233 23.60 -0.08 6.5 C8 H5 O3 0
# 3 279.1591 18.64 -0.03 5.5 C16 H23 O4 9059
已编辑:已添加答案以包括MSdata1
其中没有匹配行的行MSdata2
。这些行应该得到Intensity = -Intensity
. 一次可用于anti_join
查找此类行,然后用于bind_rows
合并所有行。
MSdata2 %>% left_join(select(MSdata1, Intensity, Composition), by="Composition") %>%
mutate(Intensity = ifelse(is.na(Intensity.y), Intensity.x, Intensity.x - Intensity.y)) %>%
select(-Intensity.y, -Intensity.x ) %>%
bind_rows(anti_join(MSdata1, MSdata2, by="Composition") %>% mutate(Intensity = -Intensity))
# m.z Relative Delta..ppm. RDB.equiv. Composition Intensity
# 1 331.1123 94.00 -0.33 6.5 C17 H26 O5 Na 4324
# 2 149.0233 23.60 -0.08 6.5 C8 H5 O3 0
# 3 279.1591 18.64 -0.03 5.5 C16 H23 O4 9059
# 4 301.1409 100.00 -0.34 5.5 C16 H22 O4 Na -7646
编辑#2:如果需要所有记录,MSdata1
那么一次可以尝试:
MSdata1 %>% left_join(select(MSdata2, Intensity, Composition), by="Composition") %>%
mutate(Intensity = ifelse(is.na(Intensity.y), -Intensity.x, Intensity.y - Intensity.x)) %>%
select(-Intensity.y, -Intensity.x )
# m.z Relative Delta..ppm. RDB.equiv. Composition Intensity
# 1 301.1409 100.00 -0.34 5.5 C16 H22 O4 Na -7646
# 2 149.0233 23.60 -0.08 6.5 C8 H5 O3 0
# 3 279.1591 18.64 -0.03 5.5 C16 H23 O4 9059
数据:
MSdata1 <- read.table(text =
"m.z Intensity Relative Delta..ppm. RDB.equiv. Composition
301.14093 7646 100.00 -0.34 5.5 'C16 H22 O4 Na'
149.02331 4083458.5 23.60 -0.08 6.5 'C8 H5 O3'
279.15908 33256 18.64 -0.03 5.5 'C16 H23 O4'",
header = TRUE, stringsAsFactors = FALSE)
MSdata2 <- read.table(text =
"m.z Intensity Relative Delta..ppm. RDB.equiv. Composition
331.11233 4324 94.00 -0.33 6.5 'C17 H26 O5 Na'
149.02331 4083458.5 23.60 -0.08 6.5 'C8 H5 O3'
279.15908 42315 18.64 -0.03 5.5 'C16 H23 O4'",
header = TRUE, stringsAsFactors = FALSE)
推荐阅读
- postgresql - postgresql 中不存在列和表之间的关系,即使它确实存在
- firebase - 错误:未为“对象”类型定义运算符“[]”
- javascript - 背景图像在我的样式表中不起作用
- html - 使用 Node.JS 访问 HTML 页面时在 Heroku 中出现错误“错误:ENOENT:没有这样的文件或目录”
- json - 将配置存储为 JSON 文件或数据库
- manim - 如何更改 x(或 y)轴标签的颜色 [manim]
- c++ - 是否可以使用 clang 格式将单行名称空间放在一条线上?
- javascript - Jquery跳到另一个页面并点击按钮事件
- javascript - WrappedApp 使用 withRedux(MyApp) { initialState: undefined, initialStateFromGSPorGSSR: undefined } 创建了新商店
- date - Kotlin 将 yyyy-MM-dd'T'HH:mm:ss 转换为人类可读的字符串