R:有条件地写入新的向量

时间:2015-09-03 18:53:43

标签: r return-value

我有一个带数值的矢量。

tstat
 [1]  -1.1210000   3.5833333   1.3142857  -0.1923077  -3.0300000  -0.2000000  -6.1200000  -3.9100000  -3.6103448
[10]   0.1352113  -0.4159624  -0.4961656   1.0370899   0.9312866   0.4525845  -0.2533333   0.3772894   0.8944724
[19]   0.6288688  -1.0187899  -1.7015306  -5.3750000  -2.7166667  -0.5000000  -0.1750000   0.7500000  -1.9230769
[28]   1.6400000  -8.3300000  -0.5800000  -8.2100000 -29.1019284 -18.7434211 -10.2397004   4.4171734  -1.9033108
[37]   4.4171734   0.7322762  -2.3500000  -5.5100000  -0.6855346   0.7477273  -0.7500000  -3.0400000  -2.1900000
[46]   0.2000000   1.1650469  -1.7006965   4.4171734   4.4171734  -0.7977768   4.4171734   0.0009231   4.7000000
[55]  -3.8600000   2.9300000   4.4500000  -6.2400000  -4.6000000  -2.1200000  -5.0200000  -4.6700000  -5.8700000
[64]  -5.1200000  -2.1800000   3.0000000   3.2000000   3.4900000   3.7300000  -2.8900000  -4.3500000  -0.3400000
[73]  -0.1800000  -0.5400000  -2.3500000  -0.5700000  -1.8000000  -5.4100000  -7.7562386   2.7343035  -7.3204276
[82]   7.0203388  -4.4171734  -4.4171734   2.6200000   2.0900000  -4.3500000   3.4400000   2.2000000  -4.3100000
[91]  -2.2300000  -2.7600000 -12.9000000  -4.0000000   0.2200000  -8.0540000 

我想:

if vector tstat has value > 1.282, then write YES in new vector B
if vector tstat has value < -1.282, then write NO in new vector B
if vector tstat has value between -1.282 and 1.282, then write NA in new vector B

我正在尝试match,但我可以使用&lt; { &GT;迹象。我怎么能这样做?

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

你可以做一个嵌套的ifelse()

set.seed(2)
(A <- sample(-70:70, 10))
# [1] -44  28   9 -47  59  58 -53  41  -8   2
ifelse(A > 32, "YES", ifelse(A < -32, "NO", NA))
# [1] "NO"  NA    NA    "NO"  "YES" "YES" "NO"  "YES" NA    NA   

答案 1 :(得分:2)

这是一种替代方法,没有ifelse()。我认为这应该更快。

set.seed(2)
A <- sample(-70:70,10)
B <- vector()
B[A > 32] <- "YES"
B[A < -32] <- "NO" 
#[1] "NO"  NA    NA    "NO"  "YES" "YES" "NO"  "YES" NA    NA   

根据您编辑的帖子的数据,这将是:

B <- vector()
B[tsat > 1.282] <- "YES"
B[tsat < -1.282] <- "NO"
> B
# [1] NA    "YES" "YES" NA    "NO"  NA    "NO"  "NO"  "NO"  NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    "NO"  "NO" 
#[23] "NO"  NA    NA    NA    "NO"  "YES" "NO"  NA    "NO"  "NO"  "NO"  "NO"  "YES" "NO"  "YES" NA    "NO"  "NO"  NA    NA    NA    "NO" 
#[45] "NO"  NA    NA    "NO"  "YES" "YES" NA    "YES" NA    "YES" "NO"  "YES" "YES" "NO"  "NO"  "NO"  "NO"  "NO"  "NO"  "NO"  "NO"  "YES"
#[67] "YES" "YES" "YES" "NO"  "NO"  NA    NA    NA    "NO"  NA    "NO"  "NO"  "NO"  "YES" "NO"  "YES" "NO"  "NO"  "YES" "YES" "NO"  "YES"
#[89] "YES" "NO"  "NO"  "NO"  "NO"  "NO"  NA    "NO"

数据

tsat <- c( -1.1210000,   3.5833333,   1.3142857,  -0.1923077,  -3.0300000,  -0.2000000,  -6.1200000,  -3.9100000,  -3.6103448,
0.1352113,  -0.4159624,  -0.4961656,   1.0370899,   0.9312866,   0.4525845,  -0.2533333,   0.3772894,   0.8944724,
0.6288688,  -1.0187899,  -1.7015306,  -5.3750000,  -2.7166667,  -0.5000000,  -0.1750000,   0.7500000,  -1.9230769,
1.6400000,  -8.3300000,  -0.5800000,  -8.2100000, -29.1019284, -18.7434211, -10.2397004,   4.4171734,  -1.9033108,
4.4171734,   0.7322762,  -2.3500000,  -5.5100000,  -0.6855346,   0.7477273,  -0.7500000,  -3.0400000,  -2.1900000,
0.2000000,   1.1650469,  -1.7006965,   4.4171734,   4.4171734,  -0.7977768,   4.4171734,   0.0009231,   4.7000000,
-3.8600000,   2.9300000,   4.4500000,  -6.2400000,  -4.6000000,  -2.1200000,  -5.0200000,  -4.6700000,  -5.8700000,
-5.1200000,  -2.1800000,   3.0000000,   3.2000000,   3.4900000,   3.7300000,  -2.8900000,  -4.3500000,  -0.3400000,
-0.1800000,  -0.5400000,  -2.3500000,  -0.5700000,  -1.8000000,  -5.4100000,  -7.7562386,   2.7343035,  -7.3204276,
7.0203388,  -4.4171734,  -4.4171734,   2.6200000,   2.0900000,  -4.3500000,   3.4400000,   2.2000000,  -4.3100000,
-2.2300000,  -2.7600000, -12.9000000,  -4.0000000,   0.2200000,  -8.0540000)

答案 2 :(得分:2)

另一个内容:使用cut来分组数据,然后将其插入查找表:

B <- c("NO", NA, "YES")[cut(tstat, c(-Inf, -1.28, 1.28, Inf), labels=FALSE)]

编辑:实际上,使用findInterval,它更快更容易阅读:

B <- c("NO", NA, "YES")[findInterval(tstat, c(-Inf, -1.28, 1.28, Inf))]