R 根据第二列的匹配值从一列中减去?

R 根据第二列的匹配值从一列中减去?,r,dataframe,R,Dataframe,我有两个数据表: A animal number dog 11 cat 7 pig 5 B animal number dog 1 cat 2 pig 2 pig 3 cat 4 dog 2 我想根据匹配的动物,从B中的数字减去A中的数字,得到结果 -10 -5 -3 -2 -3 -9 我确信我不必写循环就可以做到这一点,但我不知道如何做到这一点。我已经做了相当多的搜索,但是我这样做并没有得到任何结果。(这是使用apply的方式吗?假设

我有两个数据表:

A

animal number
dog    11
cat    7
pig    5
B

animal number
dog    1
cat    2
pig    2
pig    3
cat    4
dog    2
我想根据匹配的动物,从B中的数字减去A中的数字,得到结果

-10
-5
-3
-2
-3
-9

我确信我不必写循环就可以做到这一点,但我不知道如何做到这一点。我已经做了相当多的搜索,但是我这样做并没有得到任何结果。(这是使用
apply
的方式吗?

假设您的数据帧是
A
B
,使用
匹配是一种可能性:

B$number - A$number[match(B$animal, A$animal)]
# [1] -10  -5  -3  -2  -3  -9
如果要将此附加到
B
,请使用

B$diff <- B$number - A$number[match(B$animal, A$animal)]

#  animal number diff
#1    dog      1  -10
#2    cat      2   -5
#3    pig      2   -3
#4    pig      3   -2
#5    cat      4   -3
#6    dog      2   -9

B$diff我们可以使用
merge

AB <- merge(B, A, by = 'animal', suffixes = c('B','A'))
AB$Subtract_Number <- AB$numberB - AB$numberA

#  AB
#   animal numberB numberA Subtract_Number
# 1    cat       2       7              -5
# 2    cat       4       7              -3
# 3    dog       1      11             -10
# 4    dog       2      11              -9
# 5    pig       2       5              -3
# 6    pig       3       5              -2

下面是一个
dplyr
解决方案

library(dplyr)

inner_join(B, A, by = 'animal') %>% transmute(animal, number = number.x - number.y)

##   animal number
## 1    dog    -10
## 2    cat     -5
## 3    pig     -3
## 4    pig     -2
## 5    cat     -3
## 6    dog     -9
编辑

默认情况下,使用
mutate
而不是
transmute
将保留原始列

inner_join(B, A, by = 'animal') %>% mutate(number = number.x - number.y)

我们可以使用
data.table

library(data.table)
setDT(A)[B, i.number - number, on = "animal"]
#[1] -10  -5  -3  -2  -3  -9

您可能应该添加
all=TRUE
并将
NA
值设置为零,这样它就可以工作了@petres我不确定OP要求的是什么,虽然抱歉我的错,我认为桌子上有不匹配的动物!这正是我要找的!
library(data.table)
setDT(A)[B, i.number - number, on = "animal"]
#[1] -10  -5  -3  -2  -3  -9