2011-01-25 10 views
3

フィールドの1つに "3:29"というcsvファイルを読み込んでいます(引用符は含みません)。これが要因となります。これを数値ベクトルに変換するにはどうすればよいですか? c(3:29)?私はas.vector()を試しましたが、これは文字列ベクトル "3,4,5,6 ... 29"(引用符、まだ文字クラス)を与えます。R文字の要素と数値のベクトル

EDIT回答はより一般的な形式に適用する必要があります。たとえば、列には3:6,7,9:11が含まれています。これは同等のc(3:6,7,9: 11)。

答えて

10

に:

> eval(parse(text='3:29')) 
[1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
[26] 28 29 
+7

これを拡張して '' 3:6,7,9:11 "'のような文字列を扱う場合は、それを 'str2c < - function(s) eval(parse(text = paste( "c("、s、 ")"))) 'を実行します。 –

+0

うまくいっている、(+1) –

2

スプリット:上の文字列や数値のベクトルに変換し、手でseq()への呼び出しを生成:直接`:()`への呼び出しを構築するためにRを取得することによって

> vars <- as.numeric(strsplit("3:29", ":")[[1]]) 
> seq(from = vars[1], to = vars[2], by = 1) 
[1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
[26] 28 29 

またはもう少しエレガント:

> do.call(`:`, as.list(as.numeric(strsplit("3:29", ":")[[1]]))) 
[1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
[26] 28 29 

[が元のQに編集の光で更新]

精神で

unlist(lapply(strsplit(strsplit(txt, ",")[[1]], ":"), 
     function(x) { 
      x <- as.numeric(x) 
      if(length(x) == 2) { 
       seq(x[1], x[2], by = 1) ## `:`(x[1], x[2]) 
      } else { 
       x[1] 
      } 
     })) 

> require(fortunes) 
> fortune(106) 

If the answer is parse() you should usually rethink the question. 
    -- Thomas Lumley 
     R-help (February 2005) 

これは私がparse()を使用せずに得ることができる限り近い

[1] 3 4 5 6 7 9 10 11 

を...しかし、それは私を作りますこれは、parse()を使用するとその時代の一つかもしれません;-)

あなたが行うことができます
+0

は、特定の問題の世話をするが、より一般的な問題は、例えば、その列も3含めることができません:6,7,9:11、変換する必要がありますc(3:6,7,9:11)に相当するものに変換します。 – Benjamin

+7

謝罪していないのです;-) –

+0

@Benjaminその場合、@Michael Dunnの@ Prasadの答えに対するコメントの後に、 'parse()'がおそらく最も簡単な方法でしょう。私の一般的な 'parse()'への嫌悪感は、私の更新されたAnswerであなたの前に怪物の声が聞こえてきました。途中で良いQ(それに対して+1)。 –

関連する問題