将函数应用于R data.frame中另一列的值范围以便保持向量化的最佳方法是什么?

问题描述

我在R data.frame中有几列,并且我想根据一些现有列的值范围创建一个新列。这些范围不是规则的,并且由前两列中写入的开始和结束值确定。我希望计算保持向量化。我不要在下面的for循环。
所需的结果,通过for循环实现:

df = data.frame(start=c(2,1,4,1),end=c(3,3,5,2),values=c(1:5))
for (i in 1:nrow(df)) {
  df[i,'new'] <- sum(df[df[i,'start']:df[i,'end'],'values'])
}
df

解决方法

这是map2

的选项
library(purrr)
library(dplyr)
df %>%
     mutate(new = map2_dbl(start,end,~ sum(values[.x:.y])))

-输出

#  start end values new
#1     2   3      1   5
#2     1   3      2   6
#3     4   5      3   9
#4     4   4      4   4
#5     1   2      5   3

或与rowwise

df %>% 
    rowwise %>% 
    mutate(new =sum(.$values[start:end])) %>%
    ungroup

-输出

# A tibble: 5 x 4
#  start   end values   new
#  <dbl> <dbl>  <int> <int>
#1     2     3      1     5
#2     1     3      2     6
#3     4     5      3     9
#4     4     4      4     4
#5     1     2      5     3

或使用data.table

library(data.table)
setDT(df)[,new := sum(df$values[start:end]),seq_len(nrow(df))]
,

这是基本的R单缸纸。

mapply(function(x1,x2,y){sum(y[x1:x2])},df[['start']],df[['end']],MoreArgs = list(y = df[['values']]))
#[1] 5 6 9 4 3

还有一个。

sapply(seq_len(nrow(df)),function(i) sum(df[['values']][df[i,'start']:df[i,'end']]))
#[1] 5 6 9 4 3