2017-03-09 12 views
-2

私は1つの列が数値でなければならないデータセットを持っていますが、いくつかの行には '> ='や '< ='のような関係演算子を持つ値があります。これを簡単にするために、私はベクトルを持って考えてみます。関係演算子を含む文字列ベクトルを間隔のベクトルに変換する方法は?

a <- c('>= 0.99', '0.66', '<= 0.01') 

私は間隔の数値ベクトルに変換する方法のように:

library(intervals) 
b <- Intervals(cbind(left = c(0.99, 0.66, -Inf), right = c(Inf, 0.66, 0.01))) 
b 
# Object of class Intervals 
# 3 intervals over R: 
# [0.99, Inf] 
# [0.66, 0.66] 
# [-Inf, 0.01] 
+0

予想される出力は? – Uwe

+0

数字以外の文字を追加することはできません。 – akrun

+0

あなたの質問を編集して、コメントではなくQに期待される出力を追加してください。ありがとうございました。 – Uwe

答えて

0

おそらくスイッチを使用して問題を解決できると思います。

a <- c('>= 0.99', '= 0.66', '<= 0.01') 
oper_num <- matrix(unlist(strsplit(a," "), recursive = T), ncol=2, byrow = T) 
limits <- function(vec){ 
    operation = vec[1] 
    number = vec[2] 
    switch(
    operation, 
    ">=" = paste0("[", number,", Inf]"), 
    ">" =paste0("(", number, ", Inf]"), 
    "=" = paste0("[", number, ", ", number, "]"), 
    "<" = paste0("[-Inf, ", number, ")"), 
    "<=" =paste0("[-Inf, ", number, "]") 
) 
} 
apply(oper_num, 1, limits) 
#> [1] "[0.99, Inf]" "[0.66, 0.66]" "[-Inf, 0.01]" 
0

我々がparse_number

library(readr) 
parse_number(a) 
#[1] 0.51 0.33 0.99 0.66 0.01 
+1

申し訳ありませんが、私は質問を編集しました。この機能は本当に便利です。 – mt1022

0

を使用することができます正規表現と関数gsub():

a <- c('.51', '.33', '> .99', '.66', '<= .01') 
a.n <- gsub("<|>|=| ", "", a) 
n <- as.numeric(a.n) 
n 
[1] 0.51 0.33 0.99 0.66 0.01 

詳細については、?regexpまたはgsubを参照してください。

+0

申し訳ありませんが、私は質問を編集しました。 – mt1022

関連する問題