tidyverse使用外部向量进行变异,该向量的元素是 Dataframe 中的列值

kiayqfof  于 2023-06-27  发布在  其他
关注(0)|答案(3)|浏览(99)

让我们假设以下向量:

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

以及以下 Dataframe :

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

我想做的是,根据df中的count值,从价格向量中取1:count值,并在我的数据框中求和。
所以我想我可以做:

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

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

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

我猜这是因为它查看外部向量,然后在全局环境中搜索count,然而,它只存在于df中。
所以问题是,我如何将这个外部向量馈送到我的数据框架中,通过count值引用其元素?
预期产出将是:

count sum
1     1  10
2     3  45
3     2  25
4     4  75
wgeznvg7

wgeznvg71#

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

library(dplyr)

df %>% mutate(sum = cumsum(prices[count]))

#  count sum
#1     1  10
#2     2  25
#3     3  45
#4     4  75

根据你对其他答案的评论,如果数据框有可能有一个名为prices的列,那么这将不起作用。在这种情况下,指定.GlobalEnv从全局环境中显式使用prices

df <- data.frame(count = 1:4, prices = 4:1)

df %>% mutate(sum = cumsum(.GlobalEnv$prices[count]))
jvlzgdj9

jvlzgdj92#

关于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
ffdz8vbo

ffdz8vbo3#

您可以将df Package 在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

相关问题