R 具有动态列范围的行和

R 具有动态列范围的行和,r,data.table,tidyverse,R,Data.table,Tidyverse,我正在处理一个大型医疗保险数据集,我对具有特定索赔代码的参与者感兴趣。我的入选标准之一是,参与者必须在索赔日期前一年和之后一年投保。例如,如果他们在2017年9月27日受伤,他们需要从2016年9月27日至2018年9月27日的保险 我尝试过做一个简单的行和运算,并使用apply,但两者都有相同的问题:在from:to:numerical expression中有#元素:只使用了第一个。现在,我将范围保存为数据框中的变量。它认为我理解为什么我会有这个问题——它期望一个数字并接收一个向量。如何让它

我正在处理一个大型医疗保险数据集,我对具有特定索赔代码的参与者感兴趣。我的入选标准之一是,参与者必须在索赔日期前一年和之后一年投保。例如,如果他们在2017年9月27日受伤,他们需要从2016年9月27日至2018年9月27日的保险

我尝试过做一个简单的行和运算,并使用apply,但两者都有相同的问题:
在from:to:numerical expression中有#元素:只使用了第一个
。现在,我将范围保存为数据框中的变量。它认为我理解为什么我会有这个问题——它期望一个数字并接收一个向量。如何让它有条件地选择要求和的列。我将在下面包含我的代码

在我的例子中,我只是试图计算参与者在事故前后6个月的投保月数。
ins###
变量是一个简单的是/否变量,用于判断参与者当月是否投保。感谢您的指导

library(tidyverse)
set.seed(1)
df <- data.frame(id= seq(1,100),
                 injury_date = sample(seq(as.Date('2017/01/01'), as.Date('2017/12/31'), by="day"), 100),
                 ins_07_16 = sample(c(0,1), replace = TRUE),
                 ins_08_16 = sample(c(0,1), replace = TRUE),
                 ins_09_16 = sample(c(0,1), replace = TRUE),
                 ins_10_16 = sample(c(0,1), replace = TRUE),
                 ins_11_16 = sample(c(0,1), replace = TRUE),
                 ins_12_16 = sample(c(0,1), replace = TRUE),
                 ins_01_17 = sample(c(0,1), replace = TRUE),
                 ins_02_17 = sample(c(0,1), replace = TRUE),
                 ins_03_17 = sample(c(0,1), replace = TRUE),
                 ins_04_17 = sample(c(0,1), replace = TRUE),
                 ins_05_17 = sample(c(0,1), replace = TRUE),
                 ins_06_17 = sample(c(0,1), replace = TRUE),
                 ins_07_17 = sample(c(0,1), replace = TRUE),
                 ins_08_17 = sample(c(0,1), replace = TRUE),
                 ins_09_17 = sample(c(0,1), replace = TRUE),
                 ins_10_17 = sample(c(0,1), replace = TRUE),
                 ins_11_17 = sample(c(0,1), replace = TRUE),
                 ins_12_17 = sample(c(0,1), replace = TRUE),
                 ins_01_18 = sample(c(0,1), replace = TRUE),
                 ins_02_18 = sample(c(0,1), replace = TRUE),
                 ins_03_18 = sample(c(0,1), replace = TRUE),
                 ins_04_18 = sample(c(0,1), replace = TRUE),
                 ins_05_18 = sample(c(0,1), replace = TRUE),
                 ins_06_18 = sample(c(0,1), replace = TRUE))

df <- df %>% 
  mutate(month = as.numeric(format(as.Date(injury_date), "%m")), #pulling month of injury
         low_mo = month + 2,
         high_mo = month + 14)


df$insured <- rowSums(df[df$low_mo:df$high_mo]) #only uses first element

df$insured <- apply(df[df$low_mo:df$high_mo], 1, sum) #only uses first element
库(tidyverse)
种子(1)

df有两种方法可以做到这一点。循环遍历行序列,按行索引将数据集子集,并对每行按“low_-mo”和“high_-mo”的顺序生成列,得到
sum

o1 <- sapply(seq_len(nrow(df)), function(i) sum(df[i, df$low_mo[i]:df$high_mo[i]]))
colInd <- Map(`:`, df$low_mo, df$high_mo)
rowInd <- rep(seq_len(nrow(df)), lengths(colInd))
o2 <- as.vector(tapply(df[-(1:2)][cbind(rowInd, unlist(colInd)-2)], 
        rowInd, FUN = sum))
identical(o1, o2)
#[1] TRUE

或者另一种方法是将不在序列中的列值更改为
NA
,并使用
rowSums

colInd1 <- Map(function(x, y) which(!seq_along(df) %in% x:y), df$low_mo, df$high_mo)
rowInd1 <- rep(seq_len(nrow(df)), lengths(colInd1))
o3 <- rowSums(replace(df, cbind(rowInd1, unlist(colInd1)), 
               NA)[-(1:2)], na.rm = TRUE)
identical(o1, o3)
#[1] TRUE
colInd1或者可以是
sapply(seq_len(nrow(df)),函数(i)sum(df[i,df$low_mo[i]:df$high_mo[i]])
Thank you@akrun--您的回答很有帮助,信息丰富。我真的很感激!我以前没有使用过sapply或tapply,但现在是我进一步了解apply家族的时候了。再次感谢!
colInd1 <- Map(function(x, y) which(!seq_along(df) %in% x:y), df$low_mo, df$high_mo)
rowInd1 <- rep(seq_len(nrow(df)), lengths(colInd1))
o3 <- rowSums(replace(df, cbind(rowInd1, unlist(colInd1)), 
               NA)[-(1:2)], na.rm = TRUE)
identical(o1, o3)
#[1] TRUE