【问题标题】:Subtract values in one dataframe from another从另一个数据帧中减去一个数据帧中的值
【发布时间】:2013-09-09 23:04:21
【问题描述】:

我有两个数据框:(这些是它们的缩短版本)

一个

    Link    VU  U   P
1   DVH1    7   1   37
2   DVH2    7   0   38
3   DVH3    10  1   35

B

    Link    VU  U   P
1   DVH1    2   0   15
2   DVH2    4   0   14
3   DVH3    0   0   5

我想根据位置从 A 中的值中减去数据框 B 中的值。例如: 对于 DVH1,VU 为 7-2(或 5),生成的数据帧如下所示:

    Link    VU  U   P
1   DVH1    5   1   22
2   DVH2    3   0   24
3   DVH3    10  1   30

【问题讨论】:

    标签: r dataframe


    【解决方案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")]
    

    编辑:奖励:如果配对列太多(不仅仅是 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
    

    【讨论】:

    • 如果A$LinkB$Link 不相同,这可能是最安全的方法。如果保证它们始终相同,那么data.frame(Link=A$Link,A[2:4]-B[2:4]) 就足够了。
    【解决方案2】:

    merge(最有可能)更快的方法是确保第二个data.frame 与第一个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"))
    

    【讨论】:

    • 以相同的顺序获取两个数据帧是困难的部分,也是合并缓慢的部分原因(另一部分是非常幼稚的实现)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多