如何在R中构造这个二进制变量?

时间:2014-11-13 12:22:22

标签: r

目的是检查索引i处的值是否为1,然后将前六个条目设为1。

x <- c(0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1)

## Required output 
y <- c(1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1)

## Attempt 
for(j in seq_along(x)){
if(x[j] == 1){
   for(i in (j-6):j)
   x[i] = 1
   }}

你能帮忙解决这个或更好的方法吗?

感谢。

4 个答案:

答案 0 :(得分:5)

您可以尝试以下选项(但在尝试每个选项时不要忘记初始化x,因为我会覆盖它)

indx <- mapply(function(x, y) x:y, which(x == 1) - 6 , which(x == 1))
x[indx[indx > 0]] <- 1
x
## [1] 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

甚至更简单

indx <- sapply(which(x == 1) - 6, function(x) x:(x + 6))
x[indx[indx > 0]] <- 1
x
## [1] 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

或者

indx <- apply(cbind(which(x == 1) - 6 , which(x == 1)), 1, function(x) x[1]:x[2])
x[indx[indx > 0]] <- 1
x
## [1] 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

或者

indx <- seq_len(6)
indx <- sapply(which(x == 1), function(x) x - indx)
x[indx[indx > 0]] <- 1
x
## [1] 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

答案 1 :(得分:5)

使用filter的完全向量化解决方案:

as.integer( #turn logical value into numbers
  as.logical( #coerce to logical --> 0 becomes FALSE, everything else TRUE
   rev( #reverse order
    filter( #linear filtering
      c(rep(0, 6), #pad with zeros in the beginning to avoid NAs
        rev(x)), #revers order of input vector
          c(rep(1, 7)), sides=1 #y_i = x_i * 1 + x_(i-1) * 1 +...+ x_(i-6) * 1 
  )[-(1:6)]))) #remove NA values

#[1] 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

答案 2 :(得分:3)

使用'for'循环:

ddf = data.frame(x,y=0)
for(i in 1:nrow(ddf)){
    if(ddf[i,'x']==1){
        j = i-5
        if(j<1) j=1
        ddf[j:i,'y'] = 1
    }
}
ddf
   x y
1  0 1
2  0 1
3  0 1
4  1 1
5  0 0
6  0 0
7  0 0
8  0 0
9  0 0
10 0 0
11 0 0
12 0 1
13 0 1
14 0 1
15 0 1
16 0 1
17 1 1
18 0 1
19 1 1

y = ddf$y
y
 [1] 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

答案 3 :(得分:2)

y<-x
y[unlist(sapply(which(x==1),
                function(val){
                   val:(max(val-6,1))
                 }
                )
        )
  ]<-1

> y
 [1] 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

说明:

我首先使用which(x==1)查找x = 1的索引。然后,对于每个索引,我从{= 1}}获得x = 1到6之前的索引,然后我将结果取消列表,只有一个索引向量,y必须为1。 然后我将1分配给相应的y值。

另一个写作,分2步:

sapply(...)