【问题标题】:Dividing Two Data Frames (One into the Other) in R在R中划分两个数据帧(一个到另一个)
【发布时间】:2015-11-08 18:39:15
【问题描述】:

如何将一个数据帧除以另一个数据帧?这两个数据框具有相同的列和相同的行,但我需要将每个相交与其对应的相交划分为一个新的数据框,例如下面:

DF1
Name    Jan    Feb    Mar
Aaron     2      4      3
Blake     5      6      4

DF2
Name    Jan    Feb    Mar
Aaron     4      6      6
Blake     7      6      5

DF1/DF2 = DF3

DF3 (result)
Name    Jan    Feb    Mar
Aaron   0.5    0.7    0.5
Blake   0.7    1.0    0.8

我使用子集然后 dcast 来构建每个数据帧,但很难弄清楚如何划分它们。感谢您的帮助!

【问题讨论】:

    标签: r dataframe division


    【解决方案1】:

    我们将“DF1”和“DF2”中的数字列(通过删除第一列)和cbind 与第一列分开。

    DF3 <- cbind(DF1[1],round(DF1[-1]/DF2[-1],1))
    DF3
    #    Name Jan Feb Mar
    # 1 Aaron 0.5 0.7 0.5
    # 2 Blake 0.7 1.0 0.8
    

    【讨论】:

    • 这是否适用于某些列和行不匹配的数据框?
    • @user2105555 在这里,我们只考虑要匹配的尺寸
    【解决方案2】:

    由于您提到您使用subsetdcast 来构建每个数据框,我怀疑您已经将这些数据全部放在一个数据框中,在这种情况下分配numeratordenominator 的角色可能是为了使用ddply 运行计算,您需要做的所有事情。例如,使用您的示例数据并将其融合回一个长格式的数据框,将通过单个 ddply 为您提供以下内容:

    # data
    DF1 <- data.frame(Name = c("Aaron", "Blake"), Jan = c(2, 5), Feb = c(4, 6), Mar = c(3, 4))
    DF2 <- data.frame(Name = c("Aaron", "Blake"), Jan = c(4, 7), Feb = c(6, 6), Mar = c(6, 5))
    
    # long format with 'numerator' and 'denominator' roles assigned
    # (unnecessary if you already have long format, just assign numerator/denomninator)
    library(reshape2)
    df <- rbind(
      transform(
        melt(DF1, id.vars = "Name", variable.name = "Month"),
        role = "numerator"),
      transform(
        melt(DF2, id.vars = "Name", variable.name = "Month"),
        role = "denominator")
    )
    
    # ddply 
    library(plyr)
    ddply(df, .(Name, Month), summarize, 
          Result = value[role == "numerator"] / value[role == "denominator"])
    
    #   Name Month     Result
    # 1 Aaron   Jan 0.5000000
    # 2 Aaron   Feb 0.6666667
    # 3 Aaron   Mar 0.5000000
    # 4 Blake   Jan 0.7142857
    # 5 Blake   Feb 1.0000000
    # 6 Blake   Mar 0.8000000
    

    【讨论】:

    • +1 如果数据已经在一个 data.frame 中,那么从那个长格式计算结果可能会更清晰。使用您建议的长 data.frame dftidyrdplyr 包,这也可以这样做:df %&gt;% spread(role, value) %&gt;% mutate(Result = numerator / denominator)
    • 感谢您的努力和教育!总是很高兴看到另一种解决方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多