将数据帧中的行替换为0,前面的行值不同于0

aaa*_*aaa 8 replace r rows conditional-statements dataframe

这是我的数据帧的一个例子:

df = read.table(text = 'a  b
120 5
120 5
120 5
119 0
118 0
88 3
88 3
87 0  
10 3
10 3
10 3
7 4
6 0
5 0
4 0', header = TRUE)
Run Code Online (Sandbox Code Playgroud)

我需要将col中的0替换为b前面不同于0的数字.

这是我想要的输出:

 a  b
120 5
120 5
120 5
119 5
118 5
88 3
88 3
87 3  
10 3
10 3
10 3
7 4
6 4
5 4
4 4
Run Code Online (Sandbox Code Playgroud)

到现在为止我试过:

df$b[df$b == 0] = (df$b == 0) - 1
Run Code Online (Sandbox Code Playgroud)

但它不起作用.谢谢

Lyz*_*deR 6

na.locf来自zoo可以帮助这个:

library(zoo)
#converting zeros to NA so that na.locf can get them
df$b[df$b == 0] <- NA
#using na.locf to replace NA with previous value
df$b <- na.locf(df$b)
Run Code Online (Sandbox Code Playgroud)

日期:

> df
     a b
1  120 5
2  120 5
3  120 5
4  119 5
5  118 5
6   88 3
7   88 3
8   87 3
9   10 3
10  10 3
11  10 3
12   7 4
13   6 4
14   5 4
15   4 4
Run Code Online (Sandbox Code Playgroud)


sar*_*gas 5

在一个简单的条件下执行此任务似乎很难,但您也可以使用一个小的for循环而不是加载一个包.

for (i in which(df$b==0)) {
  df$b[i] = df$b[i-1]
}
Run Code Online (Sandbox Code Playgroud)

输出:

> df
     a b
1  120 5
2  120 5
3  120 5
4  119 5
5  118 5
6   88 3
7   88 3
8   87 3
9   10 3
10  10 3
11  10 3
12   7 4
13   6 4
14   5 4
15   4 4
Run Code Online (Sandbox Code Playgroud)

我认为对于大型data.frames来说这可能会很慢