首页 > 解决方案 > 根据另一列减去两个数据集中的列正在删除我的行

问题描述

所以我有一些代码可以查看两个数据帧,并为某些分子组合减去一个名为“强度”的列值。但是,例如,如果分子不在另一个数据框中,由于某种原因,它完全摆脱了该行,不太清楚为什么。

blankdata3 和 data3 是我要减去的两个数据框。所以我减去一个分子的强度,例如

(data3 - blankdata3) = 减去数据

我有下面的代码,根据它们是否具有相同的成分来减去强度。但是,如果 data3 有一个在空白数据 3 中找不到的组合,当我打印我的数据减去结果时,它将完全摆脱该行。我不确定它为什么要这样做,因为如果在空白数据 3 中找不到它,它不会只是减去零吗?

#data3 looks like this but with more rows
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

#blankdata3 looks like this but with more rows
m.z       Intensity    Relative Delta..ppm.  RDB.equiv. Composition 
331.11233   4324         94.00      -0.33    6.5        C17 H26 O5 Na
149.02331   3056982.3    23.60      -0.08    6.5        C8 H5 O3
279.15908   20000        18.64      -0.03    5.5        C16 H23 O4

#This is the current code I have for subtraction
datasubtracted <- blankdata3 %>% left_join(select(data3, Intensity, Composition), by ="Composition") %>%
mutate(Intensity = ifelse (is.na(Intensity.y), -Intensity.x, Intensity.y - Intensity.x)) %>%
select(-Intensity.y, -Intensity.x ) %>%
bind_rows(anti_join(data3, blankdata3, by = "Composition") %>%
          mutate( Intensity = -Intensity))

#I expect to see something like this
m.z       Intensity   Relative  Delta..ppm. RDB.equiv.  Composition 
301.14093   7646        100.00      -0.34     5.5       C16 H22 O4 Na
331.11233   -4324       94.00       -0.33     6.5       C17 H26 O5 Na
149.02331   1026476.2   23.60       -0.08     6.5       C8 H5 O3
279.15908   13256       18.64       -0.03     5.5       C16 H23 O4

运行您的代码时,它给了我这个

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
331.11233   -4324       94.00       -0.33     6.5       C17 H26 O5 Na
149.02331   -3056982.3  23.60       -0.08     6.5       C8 H5 O3
279.15908   -20000      18.64       -0.03     5.5       C16 H23 O4

看起来它使 data3 强度完好无损,而 blankdata3 强度变为负值。所以它只是结合了两个数据帧,但它没有根据相似的组合减去强度。

我的数据的精确副本如下所示

#data3
m.z       Intensity   Relative  Delta..ppm. RDB.equiv.  Composition    C  H  O  N  Na S
301.14093   7646        100.00      -0.34     5.5       C16 H22 O4 Na  16 22 4  0  1  0
149.02331   3056982.3    23.60      -0.08    6.5        C8 H5 O3       8  5  3  0  0  0
279.15908   33256       18.64       -0.03     5.5       C16 H23 O4     16 23 4  0  0  0

#blankdata3
m.z       Intensity   Relative  Delta..ppm. RDB.equiv.  Composition    C  H  O  N  Na S
331.11233   4324         94.00      -0.33    6.5        C17 H26 O5 Na  17 26 5  0  1  0
149.02331   4083458.5   23.60       -0.08     6.5       C8 H5 O3       8  5  3  0  0  0
279.15908   13256       18.64       -0.03     5.5       C16 H23 O4     16 23 4  0  0  0

标签: rstringdplyrsubtractionchemistry

解决方案


由于您只对 Intensity 进行操作,因此我建议您做一些不同于多重连接、反连接的操作:

data3$index <- "y"
blankdata3$index <- "x"

bind_rows(blankdata3, data3) %>% 
  spread(key = index, value = Intensity, fill = 0) %>% # fill = 0 replaces NA values
  mutate(Intensity = y-x) %>% 
  select(-y, -x)

推荐阅读