只是想知道是否有人知道如何在数据帧中满足条件时让 R 更改所有未来的行值?
即假设数据列中有一个负值 - 我希望 R 测试该列的负值和该值以及后续行 0 中的值(无论负值后面的值是否为负)。< /p>
非常感谢!
答案 0 :(得分:1)
这不是很优雅,但使用“经典”R 效果很好。如果 x 包含数值:
f <- function(x) {
quel <- which(x < 0)[1]
if(is.na(quel)) return(x)
x[quel:length(x)] <- 0
return(x)
}
apply(x, 2, f)
示例:
x <- as.data.frame(matrix(runif(100,-1,1), ncol=10))
print(x)
print(apply(x, 2, f))
答案 1 :(得分:1)
另一种基本的 R 方法可能是使用 cumsum
:
考虑以下 data.frame:
data
V1 V2
1 6 19
2 16 9
3 -1 14
4 18 11
5 19 2
6 1 18
7 11 -1
8 18 1
9 11 7
10 9 19
我们可以使用 cumsum 来确定需要用 0
替换的值:
sapply(data, function(x){cumsum(x <0) > 0})
V1 V2
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] TRUE FALSE
[4,] TRUE FALSE
[5,] TRUE FALSE
[6,] TRUE FALSE
[7,] TRUE TRUE
[8,] TRUE TRUE
[9,] TRUE TRUE
[10,] TRUE TRUE
从那里开始很容易:
sapply(data, function(x){x[cumsum(x <0) > 0] <- 0; x})
V1 V2
[1,] 6 19
[2,] 16 9
[3,] 0 14
[4,] 0 11
[5,] 0 2
[6,] 0 18
[7,] 0 0
[8,] 0 0
[9,] 0 0
[10,] 0 0
样本数据:
set.seed(123)
data <- as.data.frame(replicate(2,round(runif(0,20,n= 10),0)))
data[3,1] <- data[7,2] <- -1