首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从一个数据帧中减去另一个数据帧中的值

从一个数据帧中减去另一个数据帧中的值
EN

Stack Overflow用户
提问于 2013-09-10 07:04:22
回答 2查看 18K关注 0票数 17

我有两个数据帧:(它们是它们的简化版本)

一个

代码语言:javascript
运行
复制
    Link    VU  U   P
1   DVH1    7   1   37
2   DVH2    7   0   38
3   DVH3    10  1   35

B

代码语言:javascript
运行
复制
    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),结果数据帧将如下所示:

代码语言:javascript
运行
复制
    Link    VU  U   P
1   DVH1    5   1   22
2   DVH2    3   0   24
3   DVH3    10  1   30
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-10 07:16:54

使用以下命令:

代码语言:javascript
运行
复制
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: Bonus:如果有太多成对的列(不仅仅是VU、U和P),你可以这样使用:

代码语言:javascript
运行
复制
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
票数 12
EN

Stack Overflow用户

发布于 2013-09-10 09:55:53

一种比merge更快的方法(最有可能的)是确保第二个data.frame与第一个具有相同的行和列顺序,然后将它们相减:

代码语言:javascript
运行
复制
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

以下是一些示例数据:

代码语言:javascript
运行
复制
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"))
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18708395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档