根据另一个向量的条件创建新向量

时间:2018-04-09 09:22:16

标签: r

我有一个向量$(document).ready(function() { $("#inputText").keypress(function(e) { 。如何创建一个等长BUT的向量,其值为-1(如果为0或3),如果为1或5,则为1。

因此,对于v1 = c(0, 3, 5, 1, 1, 1, 3, 5, 0),我期待一个新的向量:

v1 = c(0, 3, 5, 1, 1, 3, 5, 0)

7 个答案:

答案 0 :(得分:6)

另一种可能性:

v2 <- c(-1,1)[1 + (v1 %in% c(1,5))]

给出:

> v2
[1] -1 -1  1  1  1 -1  1 -1

这是做什么的:

  • v1 %in% c(1,5)创建逻辑向量
  • 通过添加1,您可以创建1&{39}和2&#39; s的整数向量。
  • 您可以将其用作c(-1,1)上的索引向量,这将创建所需的结果

v1包含除0135之外的其他数字时,您应该更明确:

v2 <- c(-1,1)[(v1 %in% c(0,3)) + 2*(v1 %in% c(1,5))]

答案 1 :(得分:4)

我假设你对R来说是全新的。要做到这一点,你可以简单地创建一个向量v2,它是0个,并使用简单的逻辑运算符。就这样:

v1 <- c(0, 3, 5, 1, 1, 1, 3, 5, 0)
#this creates a vector in which 0 is repeated length(v1) times
v2 <- rep(0,length(v1)) 

v2[v1 == 1 | v2 == 5] <- 1
v2[v1 == 0 | v2 == 3] <- -1    

答案 2 :(得分:4)

car 是函数recode()

library("car")
v1 = c(0, 3, 5, 1, 1, 3, 5, 0)
# v2 = c(-1, -1, 1, 1, 1, -1, 1, -1)
recode(v1, "c(0, 3)=-1; else=1")
# [1] -1 -1  1  1  1 -1  1 -1

或(如果您想为不在NA中的值设置c(0, 1, 3, 5)):

recode(v1, "c(0, 3)=-1; c(1, 5)=1; else=NA")

答案 3 :(得分:3)

您的预期输出缺少一个值,因为其长度小于输入向量长度

v1 = c(0, 3, 5, 1, 1, 1, 3, 5, 0)

v2 <- ifelse(v1 == 0 | v1 == 3, -1, ifelse(v1 == 1 | v1 == 5, 1, v1))

your_result <- c(-1, -1,  1,  1,  1,  1, -1,  1, -1)
identical(v2, your_result)
[1] TRUE

答案 4 :(得分:3)

 v1 = c(0, 3, 5, 1, 1, 3, 5, 0)
 v2 <- ifelse(v1 == 0 | v1 == 3, -1, 1)
 v2
 # [1] -1 -1  1  1  1 -1  1 -1

备选我可以条件明确地填充空向量(使用vector()函数)(ifelse()函数)

v1 = c(0, 3, 5, 1, 1, 3, 5, 0)
v1
# [1] 0 3 5 1 1 3 5 0

## Empty Numeric vector of length v1  
Vec <- vector("numeric",length = length(v1))
Vec
# [1] 0 0 0 0 0 0 0 0

## Filling for 0 or 3
Vec[] <- ifelse(v1 == 0 | v1 == 3, -1, v1)
Vec
# [1] -1 -1  5  1  1 -1  5 -1

## Filling for 1 or 5
Vec[] <- ifelse(v1 == 1 | v1 == 5, 1, Vec)
Vec
# [1] -1 -1  1  1  1 -1  1 -1

备选方案II使用%in%以及vector()&amp; ifelse()填写空载体

v1 = c(0, 3, 5, 1, 1, 3, 5, 0)
v1
# [1] 0 3 5 1 1 3 5 0

Result <- vector("numeric",length = length(v1))
Result
# [1] 0 0 0 0 0 0 0 0

Result[] <- ifelse(v1 %in% c(0,3), -1, v1)
Result
# [1] -1 -1  5  1  1 -1  5 -1

Result[] <- ifelse(Result %in% c(1,5), 1, Result)
Result
# [1] -1 -1  1  1  1 -1  1 -1

答案 5 :(得分:3)

你也可以尝试一个整合的解决方案。

library(tidyverse)
mutate(tibble(a=c(0, 3, 5, 1, 1, 1, 3, 5, 0)),
              b=case_when(a %in% c(0,3) ~ -1,
                          a %in% c(1,5) ~ 1))
# A tibble: 9 x 2
      a     b
  <dbl> <dbl>
1    0.   -1.
2    3.   -1.
3    5.    1.
4    1.    1.
5    1.    1.
6    1.    1.
7    3.   -1.
8    5.    1.
9    0.   -1.

添加pull会为您提供矢量

.Last.value %>% pull(b)
[1] -1 -1  1  1  1  1 -1  1 -1

答案 6 :(得分:2)

我看到很多很好的答案,我会再增加一个编程方法。

v1 <- c(0, 3, 5, 1, 1, 1, 3, 5, 0)
v2 <- integer(length(v1))

for (i in 1:length(v1)){
  # if val is equal to 0 or 3 new value is set to -1
  if (v1[i] == 0 | v1[i] == 3){
    new_val <- -1
  }
  # if val is equal to 1 or 5 new value is set to 1
  else if (v1[i] == 1 | v1[i] == 5 ){
    new_val <- 1
  }
  # else the value remains the same
  else{
    new_val <- v1[i]
  }
  v2[i] <- new_val 
}
v2
# -1 -1  1  1  1  1 -1  1 -1