如何使用公式在 R 中的 data.frame 中的列级别更改值?

How does one change values at the column level in a data.frame in R using a formula?

我有一小部分数据样本,我正在尝试根据两列中已有的值更改这些列中的值。 data.frame 的输出如下:

structure(list(Day = c(20L, 20L, 20L, 3L, 3L, 3L, 6L, 6L, 6L, 
6L, 11L, 11L, 11L, 4L, 4L, 4L), DaysDead = c(5L, 45L, 60L, 10L, 
1L, 60L, 3L, 10L, 5L, NA, 1L, 6L, 10L, 20L, 45L, 2L), Month = c(1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 1L), 
    Year = c(6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
    6L, 7L, 7L, 7L), CorrMonth = c(1, 0, -1, 1, 2, 0, 2, 1, 2, 
    2, 3, 3, 3, 0, -1, 1), CorrYear = c(6L, 6L, 6L, 6L, 6L, 6L, 
    6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L)), .Names = c("Day", 
"DaysDead", "Month", "Year", "CorrMonth", "CorrYear"), row.names = c(NA, 
-16L), class = "data.frame")

在 data.frame 中,我有两列(CorrMonth 和 CorrYear)需要更改为:

  1. 如果CorrMonth值为0或-1,CorrYear值变为CorrYear-1,否则保持其值。

  2. 如果CorrMonth值为0,则CorrMonth变为12,如果CorrMonth值为-1,则变为11。

我必须先更改 CorrYear 列以获得正确的值,然后再更改 CorrMonth。

我使用两个不同的语句尝试了 1:

>Data$CorrYear<-ifelse(-1 >= (Data$CorrMonth) & (Data$CorrMonth) >=0, Data$CorrYear-1, Data$CorrYear)

>Data$CorrYear<-ifelse(-1 == (Data$CorrMonth) & (Data$CorrMonth) == 0, Data$CorrYear-1, Data$CorrYear)

两次尝试都没有产生我需要的结果。

> Data$CorrYear
 [1] 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7

我不知道发生了什么。我没有从 R 收到任何错误或警告消息。

我会跳过 ifelse 并仅将其作为几行单独的代码来执行:

Data$CorrYear <- Data$CorrYear - (Data$CorrMonth %in% c(-1, 0))
Data$CorrMonth[Data$CorrMonth == -1] <- 11
Data$CorrMonth[Data$CorrMonth == 0] <- 12

结果:

Data
#    Day DaysDead Month Year CorrMonth CorrYear
# 1   20        5     1    6         1        6
# 2   20       45     1    6        12        5
# 3   20       60     1    6        11        5
# 4    3       10     2    6         1        6
# 5    3        1     2    6         2        6
# 6    3       60     2    6        12        5
# 7    6        3     2    6         2        6
# 8    6       10     2    6         1        6
# 9    6        5     2    6         2        6
# 10   6       NA     2    6         2        6
# 11  11        1     3    6         3        6
# 12  11        6     3    6         3        6
# 13  11       10     3    6         3        6
# 14   4       20     1    7        12        6
# 15   4       45     1    7        11        6
# 16   4        2     1    7         1        7