首页 > 解决方案 > 根据另一列减去两个数据框中的列

问题描述

我的第一个数据集(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)

标签: rstringdplyrchemistry

解决方案


我建议使用dplyr::left_joinwith by="Composition"。根据他所表达的预期输出,OP他似乎有兴趣MSdata1MSdata2

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)

推荐阅读