我有一个向量$(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)
答案 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
包含除0
,1
,3
或5
之外的其他数字时,您应该更明确:
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