dplyr:在mutate内部调用的函数能否从当前行中找到列的元素

dplyr:在mutate内部调用的函数能否从当前行中找到列的元素,r,dplyr,vectorization,mutate,R,Dplyr,Vectorization,Mutate,我有一个非常大的数据框架和一组我希望适用于特定年份的调整系数,每个系数只适用于一年。下面的代码尝试为每行选择正确的系数,并返回一个向量,该向量包含未受影响年份中的dat,以及所选年份中该系数的dat倍,即替换dat year <- rep(1:5, times = c(2,2,2,2,2)) dat <- 1:10 df <- tibble(year, dat) adjust = c(rep(0, 4), rep(c(1 + 0.1*1:3), c(2,2,2))) df %

我有一个非常大的数据框架和一组我希望适用于特定年份的调整系数,每个系数只适用于一年。下面的代码尝试为每行选择正确的系数,并返回一个向量,该向量包含未受影响年份中的
dat
,以及所选年份中该系数的
dat
倍,即替换
dat

year <- rep(1:5, times = c(2,2,2,2,2))
dat  <- 1:10
df <- tibble(year, dat)
adjust = c(rep(0, 4), rep(c(1 + 0.1*1:3), c(2,2,2)))
df %>% mutate(dat = ifelse(year < 5, year, dat*adjust[[year - 2]]))
我很确定这是因为提取操作符
[[
年份
视为整个向量年,而不是当前行的年份,因此有一个向量化减法,因此
[[
阻塞了向量值索引

我知道有很多方法可以解决这个问题。我现在有一种特别难看的方法涉及嵌套ifelse的工作。我的问题是,有没有什么方法可以用R和dplyr惯用的方式来做我想做的事情?在某些方面,这看起来像是一个过滤器或按问题分组,因为我们希望将行或行组视为不同的实体,但我还没有找到一种更干净的方法

似乎有一些函数更容易定义或认为是逐行的,而不是整个向量的乘积。我可以生成一个向量,其中包含每年的正确调整,但由于每年的行数不同,我仍然需要应用多值条件测试来构造它向量,所以同样的问题也出现了


或者不是吗?

您需要使用
[
而不是
[[
用于向量索引;而且
第2年
产生负指数,这将进一步带来问题;如果您想将
映射到
按指数位置调整
,可以使用
替换
,使用
掩码
,该掩码指示要修改的
年份

df %>% 
    mutate(dat = {
        mask = year > 2; 
        replace(year, mask, dat[mask] * adjust[year[mask] - 2])
    })
# A tibble: 10 x 2
#   year1  dat1
#   <int> <dbl>
# 1     1   1.0
# 2     1   1.0
# 3     2   2.0
# 4     2   2.0
# 5     3   5.5
# 6     3   6.6
# 7     4   8.4
# 8     4   9.6
# 9     5  11.7
#10     5  13.0
df%>%
突变(dat={
掩码=年份>2;
更换(年份,掩码,日期[掩码]*调整[年份[掩码]-2])
})
#一个tibble:10x2
#第1年dat1
#    
# 1     1   1.0
# 2     1   1.0
# 3     2   2.0
# 4     2   2.0
# 5     3   5.5
# 6     3   6.6
# 7     4   8.4
# 8     4   9.6
# 9     5  11.7
#10     5  13.0

如何将
adjust
映射到
year
?您有五个不同的年份,但只有三个
adjust
值。year映射到year的年份少于--实际上,少于3个,而不是2个。让我来解决这个问题。谢谢Psidom!替换函数非常方便--我很惊讶以前没有遇到它。我只是在尝试我想用left_-join写一些类似的东西。如果我有时间,但不能保证,我会将它们相互比较,并将结果发布在这里。
df %>% 
    mutate(dat = {
        mask = year > 2; 
        replace(year, mask, dat[mask] * adjust[year[mask] - 2])
    })
# A tibble: 10 x 2
#   year1  dat1
#   <int> <dbl>
# 1     1   1.0
# 2     1   1.0
# 3     2   2.0
# 4     2   2.0
# 5     3   5.5
# 6     3   6.6
# 7     4   8.4
# 8     4   9.6
# 9     5  11.7
#10     5  13.0