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

时间:2016-08-17 16:08:57

标签: r dataframe

我有两个数据表:

A

animal number
dog    11
cat    7
pig    5

animal number
dog    1
cat    2
pig    2
pig    3
cat    4
dog    2

我想根据匹配的动物从 B 中的数字中减去 A 中的数字,以获得结果......

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

我确信无需编写循环即可完成此操作,但不知道如何操作。我已经做了很多搜索,但是我这样做并没有结果任何结果。 (这与apply如何使用有关吗?)

4 个答案:

答案 0 :(得分:4)

假设您的数据框为AB,使用match是一种可能性:

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

答案 1 :(得分:1)

我们可以使用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

如果 B 表中有不匹配的动物,您可能需要在all.x = TRUE功能中设置merge。请注意,这将在合并表中为NA生成numberA值。虽然原始问题没有说明这一点,但我认为@petres在评论中提出了一个很好的观点。

数据

A <- structure(list(animal = c("dog", "cat", "pig"), 
number = c(11L, 7L, 5L)), .Names = c("animal", "number"), 
class = "data.frame", row.names = c(NA, -3L))

B <- structure(list(animal = c("dog", "cat", "pig", "pig", "cat", "dog"), 
number = c(1L, 2L, 2L, 3L, 4L, 2L)), .Names = c("animal", "number"), 
class = "data.frame", row.names = c(NA, -6L))

答案 2 :(得分:1)

我们可以使用data.table

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

答案 3 :(得分:0)

这是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)