r语言 - 更新小于前一行的矩阵列中的值



我有以下矩阵:

> dput(result)
structure(list(X.22.May.2021. = c("22-May-2021", "29-May-2021", 
"05-Jun-2021", "12-Jun-2021", "19-Jun-2021", "26-Jun-2021", "03-Jul-2021", 
"10-Jul-2021", "17-Jul-2021", "24-Jul-2021", "31-Jul-2021", "07-Aug-2021", 
"14-Aug-2021", "21-Aug-2021", "28-Aug-2021", "04-Sep-2021", "11-Sep-2021", 
"18-Sep-2021", "25-Sep-2021", "02-Oct-2021", "09-Oct-2021", "16-Oct-2021", 
"23-Oct-2021", "30-Oct-2021", "06-Nov-2021", "13-Nov-2021", "20-Nov-2021", 
"27-Nov-2021", "04-Dec-2021", "11-Dec-2021", "18-Dec-2021", "25-Dec-2021", 
"01-Jan-2022", "08-Jan-2022", "15-Jan-2022", "22-Jan-2022", "29-Jan-2022", 
"05-Feb-2022", "12-Feb-2022", "19-Feb-2022", "26-Feb-2022", "05-Mar-2022", 
"12-Mar-2022", "19-Mar-2022", "26-Mar-2022", "02-Apr-2022", "09-Apr-2022", 
"16-Apr-2022", "23-Apr-2022", "30-Apr-2022", "07-May-2022", "14-May-2022", 
"21-May-2022", "28-May-2022", "04-Jun-2022", "11-Jun-2022", "18-Jun-2022", 
"25-Jun-2022", "02-Jul-2022", "09-Jul-2022", "16-Jul-2022", "23-Jul-2022", 
"30-Jul-2022", "06-Aug-2022", "13-Aug-2022", "20-Aug-2022", "27-Aug-2022", 
"03-Sep-2022", "10-Sep-2022", "17-Sep-2022", "24-Sep-2022", "01-Oct-2022", 
"08-Oct-2022", "15-Oct-2022", "22-Oct-2022", "29-Oct-2022", "05-Nov-2022", 
"12-Nov-2022", "19-Nov-2022", "26-Nov-2022", "03-Dec-2022", "10-Dec-2022", 
"17-Dec-2022", "24-Dec-2022", "31-Dec-2022", "07-Jan-2023", "14-Jan-2023", 
"21-Jan-2023", "28-Jan-2023", "04-Feb-2023", "11-Feb-2023", "18-Feb-2023", 
"25-Feb-2023", "04-Mar-2023", "11-Mar-2023", "18-Mar-2023", "25-Mar-2023", 
"01-Apr-2023", "08-Apr-2023", "15-Apr-2023", "22-Apr-2023"), 
X.0. = c("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "1", "2", "3", "4", "5", "5", "5", "5", "5", 
"5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", 
"5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", 
"5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", 
"5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", 
"5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", 
"5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", 
"5", "0", "0", "0", "0", "0", "0"), X.0..1 = c("0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "2", "6", "6", 
"6", "6", "6", "6", "6", "6", "6", "6", "6", "6", "6", "6", 
"6", "6", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "7", "7", "7", "7", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0"), X.0..2 = c("0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "2", "6", "6", "6", "6", "6", "6", 
"6", "6", "6", "6", "6", "6", "6", "6", "6", "6", "7", "7", 
"7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"), X.0..3 = c("0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "2", "6", 
"6", "6", "6", "6", "6", "6", "6", "6", "6", "6", "6", "6", 
"6", "6", "6", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "7", "7", "7"), X.0..4 = c("0", "0", "0", "0", "0", 
"0", "0", "1", "1", "2", "2", "3", "3", "4", "5", "6", "7", 
"9", "11", "14", "16", "19", "22", "25", "29", "33", "37", 
"41", "45", "50", "53", "58", "62", "67", "71", "76", "81", 
"86", "90", "95", "99", "104", "109", "114", "118", "123", 
"128", "133", "137", "142", "147", "153", "157", "162", "166", 
"172", "176", "181", "185", "190", "195", "199", "204", "209", 
"213", "218", "223", "227", "232", "237", "242", "246", "251", 
"256", "261", "266", "270", "276", "280", "284", "289", "294", 
"299", "300", "300", "300", "300", "300", "300", "300", "300", 
"300", "300", "0", "0", "0", "0", "0", "0", "0", "0"), X.0..5 = c("0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "1", "2", "3", "4", "5", "7", "9", "11", "11", 
"11", "13", "16", "19", "24", "29", "34", "39", "45", "51", 
"57", "65", "72", "80", "87", "87", "90", "97", "106", "113", 
"121", "129", "135", "143", "153", "161", "170", "175", "184", 
"192", "199", "203", "206", "211", "216", "225", "230", "238", 
"246", "254", "262", "271", "280", "288", "297", "300", "300", 
"300", "300", "300", "300", "300", "300", "300", "300", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0"), X.0..6 = c("0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "1", "2", "3", "4", "5", "7", "9", "11", "11", 
"11", "13", "16", "19", "24", "29", "34", "39", "45", "50", 
"56", "62", "69", "77", "84", "84", "87", "95", "103", "109", 
"117", "125", "132", "141", "148", "157", "166", "172", "180", 
"188", "195", "198", "201", "206", "212", "220", "226", "235", 
"244", "252", "261", "270", "279", "288", "297", "300", "300", 
"300", "300", "300", "300", "300", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0"), X.0..7 = c("0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "1", "2", "3", "4", "6", "7", "9", "11", "11", 
"11", "13", "16", "20", "24", "28", "33", "38", "42", "48", 
"54", "59", "66", "72", "78", "78", "80", "86", "93", "99", 
"105", "112", "117", "124", "130", "137", "144", "149", "155", 
"160", "166", "169", "171", "174", "178", "184", "189", "196", 
"203", "210", "217", "224", "230", "237", "244", "250", "256", 
"261", "268", "276", "281", "288", "288", "290", "297", "300", 
"300", "300", "300", "300", "300", "300", "300", "300", "0"
)), row.names = c(NA, -101L), class = "data.frame")
> result[85:100,]
X.22.May.2021. X.0. X.0..1 X.0..2 X.0..3 X.0..4 X.0..5 X.0..6 X.0..7
85     31-Dec-2022    5      7      7      7    300    300    300    268
86     07-Jan-2023    5      7      7      7    300    300    300    276
87     14-Jan-2023    5      7      7      7    300    300    300    281
88     21-Jan-2023    5      7      7      7    300    300    300    288
89     28-Jan-2023    5      7      7      7    300    300      0    288
90     04-Feb-2023    5      7      7      7    300    300      0    290
91     11-Feb-2023    5      7      7      7    300    300      0    297
92     18-Feb-2023    5      0      0      7    300      0      0    300
93     25-Feb-2023    5      0      0      7    300      0      0    300
94     04-Mar-2023    5      0      0      7      0      0      0    300
95     11-Mar-2023    5      0      0      7      0      0      0    300
96     18-Mar-2023    0      0      0      7      0      0      0    300
97     25-Mar-2023    0      0      0      7      0      0      0    300
98     01-Apr-2023    0      0      0      7      0      0      0    300
99     08-Apr-2023    0      0      0      7      0      0      0    300
100    15-Apr-2023    0      0      0      7      0      0      0    300

我正在尝试更新列,以便对于在整数之后有零的日期,我希望该值反映整数。例如:

> tail(result)
X.22.May.2021. X.0. X.0..1 X.0..2 X.0..3 X.0..4 X.0..5 X.0..6 X.0..7
96     18-Mar-2023    5      7      7      7    300    300    300    300
97     25-Mar-2023    5      7      7      7    300    300    300    300
98     01-Apr-2023    5      7      7      7    300    300    300    300
99     08-Apr-2023    5      7      7      7    300    300    300    300
100    15-Apr-2023    5      7      7      7    300    300    300    300
101    22-Apr-2023    5      7      7      7    300    300    300    300

我尝试在以下语句中使用shift来比较与前一行的值,但更新不工作,尽管我没有得到任何错误。

> result <- result %>% mutate(result, across(2:9, ~ if_else(. < shift(.) & shift(.) != 0, max(.), .)))
> result[85:100,]
X.22.May.2021. X.0. X.0..1 X.0..2 X.0..3 X.0..4 X.0..5 X.0..6 X.0..7
85     31-Dec-2022    5      7      7      7    300    300    300    268
86     07-Jan-2023    5      7      7      7    300    300    300    276
87     14-Jan-2023    5      7      7      7    300    300    300    281
88     21-Jan-2023    5      7      7      7    300    300    300    288
89     28-Jan-2023    5      7      7      7    300    300     95    288
90     04-Feb-2023    5      7      7      7    300    300      0    290
91     11-Feb-2023    5      7      7      7    300    300      0    297
92     18-Feb-2023    5      7      7      7    300     97      0    300
93     25-Feb-2023    5      0      0      7    300      0      0    300
94     04-Mar-2023    5      0      0      7     99      0      0    300
95     11-Mar-2023    5      0      0      7      0      0      0    300
96     18-Mar-2023    5      0      0      7      0      0      0    300
97     25-Mar-2023    0      0      0      7      0      0      0    300
98     01-Apr-2023    0      0      0      7      0      0      0    300
99     08-Apr-2023    0      0      0      7      0      0      0    300
100    15-Apr-2023    0      0      0      7      0      0      0    300

任何帮助将不胜感激!

将0改为NA后可以使用fill

library(dplyr)
library(tidyr)
result1 <- result %>%
mutate(across(2:9, na_if, 0)) %>% 
fill(everything(), .direction = "down")

也可能是cummax

result1 <- result %>% 
mutate(across(2:9, cummax))

最新更新