【问题标题】:multiplying data frames conditionally in R在R中有条件地乘以数据帧
【发布时间】:2011-04-26 17:10:00
【问题描述】:

我想将两个长度不等的 data.frames 相乘 如果我有一个观察数据框(实际上这大约有 30000 个条目)

Species    number
1          3
1          3
3          5
4          40
5          22

和另一个数据框,其中包含第一个数据框中存在的每个物种的转化率(这只有大约 120 个条目的长度)

species    conversion ratio
1          3
2          5
3          4
4          2
5          2

并且我想将每个数字列条目乘以与该物种关联的转换率条目,我该如何在 R 中执行此操作?

我尝试使用 match 函数无济于事,我尝试使用数组也只导致错误。

【问题讨论】:

    标签: r dataframe multiplication


    【解决方案1】:

    ?merge。假设您的 species 命名一致(大写):

    df3 <- merge(df1,df2)
    df3$number*df3$conversion.ratio
    

    【讨论】:

    • 合并步骤不会产生所需的数据帧。它产生更长的数据帧
    • @Frank 您期望的数据框维度是什么?如果您只想删除重复的行,请尝试df4 &lt;- subset(df3, !duplicated(df3))
    • 抱歉不清楚。我最终得到了一个包含数百万个条目的数据框,而我想要的数据框应该是每列约 30,000 个条目。我认为这是因为,正如@James 所提到的,这两列没有相同的名称(即物种与物种)。我将它们重命名为相同,在这种情况下,在 merge() 函数中添加 ,by="species" 是不必要的,并且一旦重命名列,您提出的解决方案就可以完美运行。抱歉,当@James 说“假设您的species 命名一致(大写)”时,我一开始不明白。
    • @Frank 似乎它现在可以工作了,但另一种方法是将您的大data.frame 压缩到与较小的相同的大小 - 即每个物种一行。 aggregatetapplyxtabs 可以解决问题。
    【解决方案2】:

    您可以合并两个数据框。

    ## Your example data
    df.number <- matrix(c(1, 1, 3, 4, 5, 3, 3, 5, 40, 22), ncol = 2)
    colnames(df.number) <- c("species", "number")
    df.ratio <- matrix(c(1, 2, 3, 4, 5, 3, 5, 4, 2, 2), ncol = 2)
    colnames(df.ratio) <- c("species", "ratio")
    
    ## Merge the two matrices
    dat <- merge(df.number, df.ratio, by = "species")
    
    ## Multiply for your result
    result <- with(dat, number * ratio)
    

    编辑

    @Frank:在您对 James 的评论中,您说合并后的结果数据框太长。您的意思是要删除重复的行吗?如果是这样:

    dat2 <- subset(dat, subset = !duplicated(dat))
    result2 <- with(dat2, number * ratio)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 2020-06-09
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多