根据另一列

时间:2018-05-08 18:33:03

标签: r string dplyr chemistry

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

2 个答案:

答案 0 :(得分:1)

我建议将dplyr::left_joinby="Composition"一起使用。根据{{​​1}}表示的预期输出,似乎他有兴趣从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 的{​​{1}}中没有匹配行的行。这些行应该MSdata1。一旦可以使用MSdata2查找此类行,然后使用Intensity = -Intensity合并所有行。

anti_join

编辑#2:如果需要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

数据:

MSdata1

答案 1 :(得分:0)

MSdata1 = MSdata1 = data.frame(m.z = c(301.14093, 149.02331, 279.15908), Intensity = c(7647, 4083458.5, 33256), Composition = c("C16 H22 O4 Na", "C8 H5 O3", "C16 H23 O4"))
MSdata2 = data.frame(m.z = c(331.11233, 149.02331, 279.15908), Intensity = c(4324, 4083458, 42315), Composition = c("C17 H26 O5 Na", "C8 H5 O3", "C16 H23 O4"))

MSdata2 %>% merge(MSdata1, by="m.z", all.x = TRUE) %>% select(-Composition.y) %>% replace(., is.na(.), 0) %>% mutate(Intensity = Intensity.x - Intensity.y)