2015-11-13 9 views
9

これはこのような愚かな質問のようですが、私は解決策を見つけることができません。私はchocolateまたはapple-orange-strawberryのようなエントリを持つカラムpeople$foodを持っています。 people$food-で分割し、分割から最初のエントリを取得します。基本的な考え方は、splitが与えるということですPythonでは、解決策はfood.split('-')[0]だろうが、私は、例えば文字列分割の最初のエントリ

word <- 'apple-orange-strawberry' 

strsplit(word, "-")[[1]][1] 
[1] "apple" 

または、同等

unlist(strsplit(word, "-"))[1]. 

をR.

答えて

10

で最初の要素を切り上げることができstrsplit()を使用したい場合は、そうでない場合

x <- c("apple", "banana-raspberry-cherry", "orange-berry", "tomato-apple") 
sub("-.*", "", x) 
# [1] "apple" "banana" "orange" "tomato" 

- ここ

sub("-.*", "", people$food) 

は一例ですまたは nth)の各エントリからのエントリ:

より明示的

または高速と:コードの

vapply(strsplit(word,"-"), `[`, 1, FUN.VALUE=character(1)) 
#[1] "apple"  "chocolate" 

両方のビットが分割されたリスト内のいずれの値を選択するとよく対応し、範囲外である場合に対処します:

vapply(strsplit(word,"-"), `[`, 2, FUN.VALUE=character(1)) 
#[1] "orange" NA 
7

の等価を見つけることができませんその結果、リストをスライス(前者の場合)またはリストから外す(後者の場合)のいずれかでアクセスする必要があります。あなたは全体の列に方法を適用する場合

first.word <- function(my.string){ 
    unlist(strsplit(my.string, "-"))[1] 
} 

words <- c('apple-orange-strawberry', 'orange-juice') 

R: sapply(words, first.word) 
apple-orange-strawberry   orange-juice 
       "apple"    "orange" 
+0

'strsplit'があるを使用することをお勧めしベクター化されているので、ベクター内の個々の項目の上にそれを「サプリー」する必要はありません。下の私の答えを見てください。 – thelatemail

+0

本当に、私はそれを知らなかった、ありがとう! – gented

3

私の代わりにsub()を使用します。スプリットの前に最初の「単語」が必要なので、最初の-の後にすべてを削除することができます。それは残っているものです。あなたは(最初に抽出する必要がある場合は、vapply()

vapply(strsplit(x, "-", fixed = TRUE), "[", "", 1) 
# [1] "apple" "banana" "orange" "tomato" 
2

私はheadいうよりR.

[
word <- c('apple-orange-strawberry','chocolate') 
sapply(strsplit(word, "-"), head, 1) 
# [1] "apple"  "chocolate" 
関連する問題