关于r:根据另一组列中的值来更改一组列

Mutate group of columns based on values in other group of columns

我正在尝试根据另一对应列中的值是否为NA将一列中的值转换为NA。我需要对两组较大的对应列执行此操作,因此我不能mutate每一列一一对应。

例如,下面,由于2002 realReturnNext2YearsNA,因此2002 inflationNext2Years变为NA

1
2
3
4
5
6
7
8
9
10
11
12
13
year <- c(2000, 2001, 2002)
realReturnNext1Years <- c(.1,.2,.3)
realReturnNext2Years <- c(.15,.25, NA)
realReturnNext3Years <- c(.45, NA, NA)
inflationNext1Years <- c(.02, .03, .07)
inflationNext2Years <- c(.03, .05, .08)
inflationNext3Years <- c(.04, .06, .09)
data <- data.frame(year, realReturnNext1Years, realReturnNext2Years, realReturnNext3Years, inflationNext1Years, inflationNext2Years, inflationNext3Years)
data
   year realReturnNext1Years realReturnNext2Years realReturnNext3Years inflationNext1Years inflationNext2Years inflationNext3Years
1 2000                  0.1                 0.15                 0.45                0.02                0.03                0.04
2 2001                  0.2                 0.25                   NA                0.03                0.05                0.06
3 2002                  0.3                   NA                   NA                0.07                0.08                0.09

我正试图将data隐蔽为:

1
2
3
4
year realReturnNext1Years realReturnNext2Years realReturnNext3Years inflationNext1Years inflationNext2Years inflationNext3Years
2000                  0.1                 0.15                 0.45                0.02                0.03              0.04
2001                  0.2                 0.25                   NA                0.03                0.05              NA
2002                  0.3                   NA                   NA                0.07                NA                NA

由于我有很多列,所以我一次不能做一列。我尝试将mutate_atifelse()结合使用,但不确定如何测试是否排列了年数。

我有一个realReturn列名的向量和另一个inflation列名的向量。我试图将其对应的realReturnColumn为NA的通货膨胀列更改为NA,但如果realReturnColumn不是NA的通货膨胀列保持不变。


我们可以使用grep收集" realReturnNext"列的索引,获取其NA的位置,并将" inflationNext"列中的相应位置替换为NA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
real_cols <- grep("^realReturnNext", colnames(data))
inflation_cols <- grep("^inflationNext", colnames(data))

data[inflation_cols][is.na(data[real_cols])] <- NA

#  year realReturnNext1Years realReturnNext2Years realReturnNext3Years
#1 2000                  0.1                 0.15                 0.45
#2 2001                  0.2                 0.25                   NA
#3 2002                  0.3                   NA                   NA

#  inflationNext1Years inflationNext2Years inflationNext3Years
#1                0.02                0.03                0.04
#2                0.03                0.05                  NA
#3                0.07                  NA                  NA