R:ifelse conditioning - >替换为条件为真的最后一个值

时间:2014-09-07 18:35:13

标签: r if-statement

让我说我有这样的意见:

input=data.frame(x=c(2,3,4,5,6,7), y=c(5,5,4,4,3,5))

    x   y
1   2   5
2   3   5
3   4   4
4   5   4
5   6   3
6   7   5

现在我想替换x的值,如果y< 5.在这种情况下,我想取y =>的最后一个x值。 5

这样的事情:

attach(input)
xnew=ifelse(y < 5, "last x value for which y=> 5", x)

对于该示例,输出应如下所示:

   xnew y
1   2   5
2   3   5
3   3   4
4   3   4
5   3   3
6   7   5

我需要更换"last x value for which y=> 5"才能使其正常工作?

提前致谢!

2 个答案:

答案 0 :(得分:3)

indx <- input$y[tail(which(input$y <5),1)]
input$x[input$y <5] <- indx
 input
 #  x y
 #1 2 5
 #2 3 5
 #3 3 4
 #4 3 4
 #5 3 3
 #6 7 5

或使用data.table

 library(data.table)
 setDT(input)[y <5, x:= y[max(which(y <5))]]

更新

使用新数据集:

 input=data.frame(x=c(2,3,4,5,6,7,8,9,10,11,12), y=c(5,5,4,4,3,5,3,5,3,3,5))

 indx <- which(c(0,diff(input$y<5))==1)
 indx1 <- cumsum(which(input$y <5) %in% indx)
 input$x[which(input$y <5)]<- input$x[indx-1][indx1]
  input
 #    x y
 #1   2 5
 #2   3 5
 #3   3 4
 #4   3 4
 #5   3 3
 #6   7 5
 #7   7 3
 #8   9 5
 #9   9 3
 #10  9 3
 #11 12 5

答案 1 :(得分:3)

我会从na.locf包中尝试zoo。使用评论中的input

input=data.frame(x=c(2,3,4,5,6,7,8,9,10,11,12), y=c(5,5,4,4,3,5,3,5,3,3,5)) 
input[input$y < 5, "x"] <- NA
library(zoo)
input$x <- na.locf(input$x)
input
#     x y
# 1   2 5
# 2   3 5
# 3   3 4
# 4   3 4
# 5   3 3
# 6   7 5
# 7   7 3
# 8   9 5
# 9   9 3
# 10  9 3
# 11 12 5