Rベクトルのすべての要素から最後のn文字を削除する方法


106

私はRに非常に慣れていないため、ベクトル(配列?)のすべての要素から最後のn文字を削除する簡単な例をオンラインで見つけることができませんでした。

私はJavaの出身なので、すべての要素を繰り返し処理しa$data、最後の3文字をすべての要素から削除します。

それについてどう思いますか?

回答:


115

これが私がすることの例です。それがあなたが探しているものだといいのですが。

char_array = c("foo_bar","bar_foo","apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)

aには次のものが含まれるはずです。

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4

おかしなことに、私は希望する効果を得るために変更-3する-0必要がありました!:私は次のように、日付のデータの多くを持って"2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"一緒にはい、2つのタイムゾーン、およびas.Date機能は、(BSTの日付の日以前)予期しない結果を返している- -それゆえ私は、タイムゾーンスタンプを削除したかった、ターンを私がする必要があるから実行する-0と、時間とともに消滅します
LucasSeveryn 14年

strptime関数も考慮してください。ただし、以前はタイムゾーンを使用していません。認識できるかもしれません。おそらく「%Z」はタイムゾーンを認識します。sapply関数も削除しました。Rが関数をベクトル化するのにどれだけ好きかを忘れました。
nfmcclure 2014年

@LucasSeverynタイムゾーンを考慮して文字の時間表現を日付に変換する場合は、質問にそれを編集してください。おそらく、希望する結果(などstrptime)に直接アクセスできるより良い答えがあるでしょう。
ブルーマジスター

84

ここに方法がありgsubます:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"

4
(+1)正規表現の大ファン。それはほとんどすべてで使用できます。
Rich Scriven、2014年

8
注:カットする文字数より長い場合、元の文字列を返します。考えてくださいgsub('.{5}$', '', 'abcd')
Tomas Greif、2015年

32

これは、@ nfmcclureによる回答とほとんど同じですが、stringrパッケージが基本Rの関数よりも一貫性があり説明的な名前の関数のセットを提供するため、私はパッケージを使用することを好みます(実際、私は常に名前を思い出せないので、R "の文字nchar())。

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

これにより、Species列の各値から最後の3文字が削除されます。


22
stringr、パッケージも、簡単な解決策がある: str_sub(iris$Species, end=-4)
1月-GLX

13

stringiパッケージでも同じことが可能です:

library('stringi')
char_array <- c("foo_bar","bar_foo","apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
## [1] "foo_" "bar_" "ap"   "b" 

2

@Matthew_Plourdeと同様 gsub

ただし、元の文字列がカットする文字数より短い場合は、ゼロ文字にトリムするパターン、つまり「」を返します。

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

違いは、{0,3}量指定子が0〜3個の一致を示すのに対し{3}、正確に3個の一致が必要な場合、一致が見つからない場合gsub、元の変更されていない文字列が返されます。

NBの使用{,3}はと同等{0,3}です。私は単に後者の表記を好みます。

正規表現の数量詞の詳細については、こちらをご覧くださいhttps : //www.regular-expressions.info/refrepeat.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.