如何使用公式在 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)需要更改为:
如果CorrMonth值为0或-1,CorrYear值变为CorrYear-1,否则保持其值。
如果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
我有一小部分数据样本,我正在尝试根据两列中已有的值更改这些列中的值。 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)需要更改为:
如果CorrMonth值为0或-1,CorrYear值变为CorrYear-1,否则保持其值。
如果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