代码之家  ›  专栏  ›  技术社区  ›  deschen

tidyverse与外部向量发生突变,该外部向量的元素是数据帧中的列值

  •  1
  • deschen  · 技术社区  · 1 年前

    让我们假设以下向量:

    prices <- c(10, 15, 20, 30)
    

    以及以下数据帧:

    df <- data.frame(count = c(1, 3, 2, 4))
    

    我想做的是,取决于 count 中的值 df ,采取 1:count 价格向量中的值,并在我的数据框架中对这些值进行汇总。

    所以我想我可以:

    library(tidyverse)
    df |>
      mutate(sum = sum(!!prices[1:count]))
    

    但是,这会产生一个错误:

    Error in quos(..., .ignore_empty = "all") : 
      object 'count' not found
    

    我想这是因为它观察外部向量,然后搜索 计数 然而,在全球环境中,它只存在于df中。

    所以问题是,我如何将这个外部向量输入到我的数据框架中,通过 计数 价值观

    预期产出为:

      count sum
    1     1  10
    2     3  45
    3     2  25
    4     4  75
    
    3 回复  |  直到 1 年前
        1
  •  4
  •   Ronak Shah    1 年前

    您可以子集 prices 在的帮助下 count 然后使用 cumsum

    library(dplyr)
    
    df %>% mutate(sum = cumsum(prices[count]))
    
    #  count sum
    #1     1  10
    #2     2  25
    #3     3  45
    #4     4  75
    

    根据您对其他答案的评论,如果数据帧可能有一个名为 价格 那么这将不起作用。在这种情况下,请指定 .GlobalEnv 明确使用 价格 来自全球环境。

    df <- data.frame(count = 1:4, prices = 4:1)
    
    df %>% mutate(sum = cumsum(.GlobalEnv$prices[count]))
    
        2
  •  2
  •   Maël    1 年前

    具有 sapply 。并使用 .GlobalEnv$ 如有必要:

    df |>
      mutate(sum = sapply(count, \(x) sum(.GlobalEnv$prices[1:x])))
    
    #   count sum
    # 1     1  10
    # 2     3  45
    # 3     2  25
    # 4     4  75
    
        3
  •  2
  •   langtang    1 年前

    你可以包装 df 在里面 rowwise()

    library(dplyr)
    mutate(rowwise(df), total = sum(prices[1:count]))
    

    输出:

      count total
      <int> <dbl>
    1     1    10
    2     2    25
    3     3    45
    4     4    75