Вычитайте значения в одном фрейме данных из другого
У меня есть два кадра данных: (это их сокращенные версии)
А
Link VU U P
1 DVH1 7 1 37
2 DVH2 7 0 38
3 DVH3 10 1 35
В
Link VU U P
1 DVH1 2 0 15
2 DVH2 4 0 14
3 DVH3 0 0 5
Я хочу вычесть значения в кадре данных B из тех, что указаны в A, в зависимости от их местоположения. Так, например:
Для DVH1 VU будет 7-2 (или 5), и результирующий кадр данных будет выглядеть так:
Link VU U P
1 DVH1 5 1 22
2 DVH2 3 0 24
3 DVH3 10 1 30
Ответы
Ответ 1
Используйте это:
within(merge(A,B,by="Link"), {
VU <- VU.x - VU.y
U <- U.x - U.y
P <- P.x - P.y
})[,c("Link","VU","U","P")]
EDIT: Бонус: если слишком много парных столбцов (а не только VU, U и P), вы можете использовать это:
M <- merge(A,B,by="Link")
S <- M[,grepl("*\\.x$",names(M))] - M[,grepl("*\\.y$",names(M))]
cbind(M[,1,drop=FALSE],S)
# Link VU.x U.x P.x
#1 DVH1 5 1 22
#2 DVH2 3 0 24
#3 DVH3 10 1 30
Ответ 2
Более быстрый способ, чем merge
(скорее всего) состоит в том, чтобы убедиться, что второй data.frame
находится в том же порядке строк и столбцов, что и первый, и вычитает их друг из друга:
z <- names(A)[-1]
cbind(A[1], A[z] - B[match(A$Link, B$Link), z])
# Link VU U P
# 1 DVH1 5 1 22
# 2 DVH2 3 0 24
# 3 DVH3 10 1 30
Вот некоторые примеры данных:
A <- structure(list(Link = c("DVH1", "DVH2", "DVH3"), VU = c(7L, 7L,
10L), U = c(1L, 0L, 1L), P = c(37L, 38L, 35L)), .Names = c("Link",
"VU", "U", "P"), class = "data.frame", row.names = c("1", "2", "3"))
B <- structure(list(Link = c("DVH1", "DVH3", "DVH2"), P = c(15L, 5L,
14L), U = c(0L, 0L, 0L), VU = c(2L, 0L, 4L)), .Names = c("Link",
"P", "U", "VU"), class = "data.frame", row.names = c("1", "3", "2"))