R 根据第二列的匹配值从一列中减去?
我有两个数据表: AR 根据第二列的匹配值从一列中减去?,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的方式吗?假设
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