web-dev-qa-db-ja.com

文字列分割からの最初のエントリ

chocolateや_people$food_などのエントリを含む列_Apple-orange-strawberry_があります。

_people$food_を_-_で分割し、分割から最初のエントリを取得します。

Pythonでは、解決策はfood.split('-')[0]ですが、Rに相当するものが見つかりません.

20
Pistol Pete

各分割から最初の(またはnth)エントリを抽出する必要がある場合は、次を使用します。

Word <- c('Apple-orange-strawberry','chocolate')

sapply(strsplit(Word,"-"), `[`, 1)
#[1] "Apple"     "chocolate"

またはより速く、より明確に:

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

コードの両方のビットは、分割リスト内のいずれかの値の選択にうまく対処し、範囲外のケースを処理します。

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

例えば

Word <- 'Apple-orange-strawberry'

strsplit(Word, "-")[[1]][1]
[1] "Apple"

または、同等に

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

基本的に、splitは結果としてリストを提供し、その要素はスライス(前者の場合)またはリスト解除(後者)のいずれかによってアクセスする必要があるという考え方です。

メソッドを列全体に適用する場合:

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"
16
gented

代わりにsub()を使用します。分割前に最初の「Word」が必要なので、最初の_-_の後のすべてを単純に削除することができます。それが残っています。

_sub("-.*", "", people$food)
_

以下に例を示します-

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

それ以外の場合、strsplit()を使用する場合は、vapply()で最初の要素を切り上げることができます

_vapply(strsplit(x, "-", fixed = TRUE), "[", "", 1)
# [1] "Apple"  "banana" "orange" "tomato"
_
7
Rich Scriven

Rで[ではなくheadを使用することをお勧めします。

Word <- c('Apple-orange-strawberry','chocolate')
sapply(strsplit(Word, "-"), head, 1)
# [1] "Apple"     "chocolate"
2
Ven Yao

dplyr/magrittrアプローチ:

library(magrittr)
library(dplyr)

Word = c('Apple-orange-strawberry', 'chocolate')

strsplit(Word, "-") %>% sapply(extract2, 1)
# [1] "Apple"     "chocolate"
0
Ömer An