在 R 中循环数据帧以执行缺失变量的增长函数

问题描述 投票:0回答:1

我想通过使用 ID 和年龄的每个唯一组合的第一个观察值 (x1=9.4, 11.5, 12.1) 添加接下来几年的 1.5% 增长来计算变量“x1”的缺失值。请参阅以下示例:

#Create data frame
data<- data.frame(ID = c(1,1,1,2,2,2,3,3,3), Age= c(20,21,22,20,21,22,20,21,22), x1= c(9.4,NA, NA, 11.5, NA, NA, 12.1, NA, NA))

我尝试使用 dplyr 来改变缺失的 NA,但没有成功:

df = data %>% group_by(ID, Age) %>% mutate(x1=ifelse(is.na(x1), lag(x1)+ (lag(x1)*0.015), x1))

我也尝试过在嵌套循环中处理它,但不知道当年龄增加一年时如何引用以前丢失的变量作为下一个函数的输入:

i<- 1
for(i in 1:length(unique(data$ID))){
  j<-1
  for(j in 1:length(unique(data$Age))) {
   print(x1<- lag(data$x1)+ (lag(data$x1) * 0.015))
    j<- j+1
    
  }
}

这就是我生成的数据集应该是什么样的:

data<- data.frame(ID = c(1,1,1,2,2,2,3,3,3), Age= c(20,21,22,20,21,22,20,21,22), x1= c(9.4,9.54, 9.68, 11.5, 11.67, 11.84, 12.1, 12.28, 12.46))

r function dplyr nested-loops
1个回答
0
投票

在基础 R 中:

transform(data, x1 = ave(x1, ID, FUN = \(x)x[1]*1.015^(seq_along(x)-1)))
  ID Age        x1
1  1  20  9.400000
2  1  21  9.541000
3  1  22  9.684115
4  2  20 11.500000
5  2  21 11.672500
6  2  22 11.847587
7  3  20 12.100000
8  3  21 12.281500
9  3  22 12.465722

data %>%
   mutate(x1 = first(x1)*1.015^(row_number() - 1), .by = ID)

  ID Age        x1
1  1  20  9.400000
2  1  21  9.541000
3  1  22  9.684115
4  2  20 11.500000
5  2  21 11.672500
6  2  22 11.847587
7  3  20 12.100000
8  3  21 12.281500
9  3  22 12.465722
© www.soinside.com 2019 - 2024. All rights reserved.