在具有数值和字符的向量上使用"larger than" / "smaller than"

  • 本文关键字:than smaller larger 向量 字符 r
  • 更新时间 :
  • 英文 :


这似乎是最愚蠢的问题,但我不知道是怎么回事。

我有以下数据:

test <- c("A", 1, 2)    
out <- rep("ON", 3)

我想替换数值大于1的值(所以2应该是OFF)。

如果我这样做:

out[test > 1] <- "OFF"   
out

我:

[1] "OFF" "ON"  "OFF"

因为显然"A" > 1 = TRUE

如果我这样做

out[as.numeric(test > 1)] <- "OFF" 

我:

[1] "OFF" "ON"  "ON" 

即使as.numeric(test > 1)是:

[1] 1 0 1

as.numeric("A")NA,NA > 1NA

获得这些值的正确方法是什么?

<标题>

编辑因为我正在使用的函数如果有警告就会抛出错误,所以我尝试将akrun和Dmitry的解决方案组合起来(因为该解决方案会抛出警告)。

然而,由于某些原因:

test <- c("25", "38", "40", "38", "207", "16", "31", "18", "22", "20", 
"3", "19", "4", "43", "20", "15", "21", "36", "36", "23", "33", 
"31", "48")
grepl("^[0-9.]+$", test) & test < 10

[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[20] FALSE FALSE FALSE FALSE

一种方法可能是在test向量上使用一个简单的ifelse语句,而不需要out向量:

ifelse(test %in% "2", "OFF","ON")
# [1] "ON"  "ON"  "OFF"

这只适用于您提供的测试数据集,但如果对大于2的值有限制,您可以扩展它:

test <- c("A", 1, 2, 999)
ifelse(test %in% as.character(2:1000), "OFF","ON")
# [1] "ON"  "ON"  "OFF" "OFF"
test <- c("A", 1, 2)    
out <- rep("ON", 3)
idx <- as.numeric(test) > 1
is.na(idx) <- FALSE
out[idx] <- 'OFF'
out
[1] "ON"  "ON" "OFF" 

相关内容

最新更新