3

次のような文字列があります

str <- "- var_a + var_c - var_d"

ベクトルの値を変更したいvec

 vec <- c(var_a=0, var_b=0, var_c=0, var_d=0, var_e=0)
 vec
 var_a var_b var_c var_d var_e 
    0     0     0     0     0 

によるとstr:変数に負の符号がある場合は常に、対応するエントリvecを-1に設定し、正の符号が1にある場合は、次のようにします。私の望ましい出力は次のようになります。

var_a var_b var_c var_d var_e 
   -1     0     1    -1     0

私の考えは、のすべての名前をループしてvec、正規表現を使用して対応する記号を抽出しようとするstrことでしたが、記号を取得する方法がよくわかりません。たとえば、どのlapply(names(vec), grepl, str)変数が文字列に含まれているかしかわかりません.

またはなど、もっと簡単な方法はありませんformulaexpression?パッケージも見ましたが、Ryacas必要なものが見つかりませんでした。

4

4 に答える 4

3

scanデータの読み取りと分割に使用します。スキャンはデータを読み取り、それをベクトルに入れます。

vec <- c(var_a=0, var_b=0, var_c=0, var_d=0, var_e=0)
ll <- scan(text=str,what='string')
## EDIT here to treat the case the first elment is not a sign
## i.e: var_a + var_c - var_d
pos <- ll %in% c('-','+')
if(length(ll[pos]) != length(ll[!pos])) ll <- append(ll,'+',0)
vec[ll[!pos]] <- ifelse(ll[pos] == '-',-1,1)
于 2013-10-14T16:22:13.107 に答える
2

このアプローチは気に入ってregexいますが、正規表現が変数名と互換性があることに注意する必要があります。これにより、文字が前にあるスペースで文字列が分割されます([[:alphanum:]]より柔軟にするために使用できますが、文字列に数字が含まれるかどうかはわかりません...

#  Split variables
args <- strsplit( str , "(?<=[a-z])\\s" , perl = TRUE )[[1]]

#  Extract sign and convert to integer
sign <- as.integer( paste0( strtrim(args , 1 ) , 1 ) )

# Match and change the corresponding values of vec
vec[ match( substring( args , first = 3 ) , names(vec) ) ] <- sign
#var_a var_b var_c var_d var_e 
#   -1     0     1    -1     0 
于 2013-10-14T16:18:48.243 に答える