【发布时间】:2022-11-10 22:04:03
【问题描述】:
我有一个具有连续值的数据框,是否可以在 1 秒后使 = 0 的数字?
df <- data.frame(a = c(0,0,0,0,1,1,1,0,0,0),
b = c(0,0,1,1,1,1,0,0,0,0),
c = c(1,1,0,0,0,0,0,1,1,0))
像这样:
【问题讨论】:
我有一个具有连续值的数据框,是否可以在 1 秒后使 = 0 的数字?
df <- data.frame(a = c(0,0,0,0,1,1,1,0,0,0),
b = c(0,0,1,1,1,1,0,0,0,0),
c = c(1,1,0,0,0,0,0,1,1,0))
像这样:
【问题讨论】:
library(dplyr)
df %>%
mutate(across(everything(), ~ +(.x == 1 & lag(.x, default = 0) != 1)))
输出
a b c
1 0 0 1
2 0 0 0
3 0 1 0
4 0 0 0
5 1 0 0
6 0 0 0
7 0 0 0
8 0 0 1
9 0 0 0
10 0 0 0
【讨论】:
应用diff 函数可能是BaseR 的另一个替代方案,
out <- rbind(df[1,],apply(df,2,diff))
out[out!=1] <- 0
给,
# a b c
#1 0 0 1
#2 0 0 0
#3 0 1 0
#4 0 0 0
#5 1 0 0
#6 0 0 0
#7 0 0 0
#8 0 0 1
#9 0 0 0
#10 0 0 0
【讨论】:
df[-1,] <- df[-1,]*(df[-nrow(df),] == 0)
df
#> a b c
#> 1 0 0 1
#> 2 0 0 0
#> 3 0 1 0
#> 4 0 0 0
#> 5 1 0 0
#> 6 0 0 0
#> 7 0 0 0
#> 8 0 0 1
#> 9 0 0 0
#> 10 0 0 0
【讨论】:
我们加载data.table 以供shift() 使用。
library(data.table)
df[] <- lapply(df, (x) replace(x, shift(x, fill = 0) == 1, 0))
df
# a b c
# 1 0 0 1
# 2 0 0 0
# 3 0 1 0
# 4 0 0 0
# 5 1 0 0
# 6 0 0 0
# 7 0 0 0
# 8 0 0 1
# 9 0 0 0
# 10 0 0 0
【讨论】: