我有两个数据表:
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
如何使用有关吗?)
答案 0 :(得分:4)
假设您的数据框为A
和B
,使用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)