我有一个数据集,需要将任何值都更改为0,但在过去48小时中有一个非零的值更改为一个特定的字符串。在执行此操作之前,我可能需要将dbl中的第一列转换为chr吗?
Time colA colB colC colD
<dttm> <dbl> <dbl> <dbl> <dbl>
1 2021-11-21 10:00:00 8 0 9 176
2 2021-11-11 11:00:00 21 0 22 416
3 2021-11-21 11:00:00 19 0 20 373
4 2021-11-11 12:00:00 40 13 28 566
5 2021-11-21 12:00:00 26 0 27 527
6 2021-11-11 13:00:00 50 20 32 651
7 2021-11-11 10:00:00 11 0 12 216
8 2021-11-21 13:00:00 30 0 31 617
9 2021-11-11 14:00:00 51 0 32 675
10 2021-11-21 14:00:00 31 0 32 644很抱歉,数据还没有按时间进行排序,正在进行修复。例如,下面是我想要得到的输出:
Time colA colB colC colD
<dttm> <dbl> <dbl> <dbl> <dbl>
1 2021-11-21 10:00:00 8 0 9 176
2 2021-11-11 11:00:00 21 0 22 416
3 2021-11-21 11:00:00 19 0 20 373
4 2021-11-11 12:00:00 40 13 28 566
5 2021-11-21 12:00:00 26 0 27 527
6 2021-11-11 13:00:00 50 20 32 651
7 2021-11-11 10:00:00 11 0 12 216
8 2021-11-21 13:00:00 30 0 31 617
9 2021-11-11 14:00:00 51 STRING1 32 675
10 2021-11-21 14:00:00 31 0 32 644由于colB的值在2021-11-11 :00:00时为0,但在此之前的48小时内至少有一个以前的值,因此它被更改为"STRING1“。
很抱歉,如果这让人感到困惑,我正在尝试在Excel中自动执行一些我通常手工做的事情。提前感谢
发布于 2022-01-05 00:50:02
这是一个潮汐的解决方案。我将首先创建一些示例数据(注意,我确实将其他列设置为字符):
data = tribble(
~ time, ~ colA, ~ colB,
"2021-11-21 12:00:00", 1, 0,
"2021-11-22 00:00:00", 0, 1,
"2021-11-24 12:00:00", 0, 0,
"2021-11-25 12:00:00", 1, 1,
"2021-11-26 12:00:00", 0, 0,
) %>%
mutate(
time = ymd_hms(time),
across(-time, as.character)
)
# A tibble: 5 x 3
time colA colB
<dttm> <chr> <chr>
1 2021-11-21 12:00:00 1 0
2 2021-11-22 00:00:00 0 1
3 2021-11-24 12:00:00 0 0
4 2021-11-25 12:00:00 1 1
5 2021-11-26 12:00:00 0 0 这个问题的挑战是,每一次,我们都需要知道要寻找哪些其他行来确定每一列的新值。为此,我将使用purrr:pmap()和dplyr中可用的.data对象。首先,我将演示如何在过去48小时内“回顾”一段时间内的行:
data %>%
mutate(
across(
.cols = -time,
function(col) {
pmap_chr(list(time), function(t) {
eligible = .data$time >= t - hours(48) & .data$time < t
paste(col[eligible], collapse = ",")
})
},
.names = "{.col}_previous"
)
)输出:
# A tibble: 5 x 5
time colA colB colA_previous colB_previous
<dttm> <chr> <chr> <chr> <chr>
1 2021-11-21 12:00:00 1 0 "" ""
2 2021-11-22 00:00:00 0 1 "1" "0"
3 2021-11-24 12:00:00 0 0 "" ""
4 2021-11-25 12:00:00 1 1 "0" "0"
5 2021-11-26 12:00:00 0 0 "0,1" "0,1" 正如你所看到的,这看起来很有希望。我们已经准备好开发解决方案,以这为核心思想。
data %>%
mutate(
across(
.cols = -time,
function(col) {
modify_ind = pmap_lgl(list(time), function(t) {
eligible = .data$time >= t - hours(48) & .data$time < t
any(col[eligible] != "0")
})
ifelse(modify_ind & col == "0", "STRING1", col)
}
)
)输出:
# A tibble: 5 x 3
time colA colB
<dttm> <chr> <chr>
1 2021-11-21 12:00:00 1 0
2 2021-11-22 00:00:00 STRING1 1
3 2021-11-24 12:00:00 0 0
4 2021-11-25 12:00:00 1 1
5 2021-11-26 12:00:00 STRING1 STRING1一些注意事项:
在我的解决方案中,
modify_ind:访问在过去48小时内过滤过的列,然后检查是否有任何非零值。然后,当列的值为"0".across()添加一个.names参数。https://stackoverflow.com/questions/70586373
复制相似问题