字符串拆分的第一个条目

Pis*_*ete 20 split r

我有一个列people$food有像chocolate或的条目apple-orange-strawberry.

我想分裂people$food的-,并从分裂中的第一项.

在python中,解决方案是food.split('-')[0],但我找不到R的等价物.

the*_*ail 27

如果需要nth从每个拆分中提取第一个(或)条目,请使用:

word <- c('apple-orange-strawberry','chocolate')

sapply(strsplit(word,"-"), `[`, 1)
#[1] "apple"     "chocolate"
Run Code Online (Sandbox Code Playgroud)

或更快,更明确:

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

这两段代码都可以很好地处理拆分列表中的任何值,并处理超出范围的情况:

vapply(strsplit(word,"-"), `[`, 2, FUN.VALUE=character(1))
#[1] "orange" NA  
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,对于非 R 语言的人来说,这个 `sapply(strsplit(word,"-"), `[`, 1)` 根本不可读。 (11认同)
  • 我想如果你想使用一个单词,而你只想使用一个值,你可以这样做 `sapply(strsplit(word,"-"), getElement, 1)` (3认同)
  • 使用“getElement”一词在可读性(以及质量)方面增加了很多。谢谢 (2认同)

gen*_*ted 16

例如

word <- 'apple-orange-strawberry'

strsplit(word, "-")[[1]][1]
[1] "apple"
Run Code Online (Sandbox Code Playgroud)

或者,等效地

unlist(strsplit(word, "-"))[1].
Run Code Online (Sandbox Code Playgroud)

基本上,这个想法是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"
Run Code Online (Sandbox Code Playgroud)


Ric*_*ven 8

我会sub()改用。因为您想要拆分前的第一个“单词”,所以我们可以简单地删除第一个单词之后的所有内容-,这就是我们剩下的。

sub("-.*", "", people$food)
Run Code Online (Sandbox Code Playgroud)

这是一个例子-

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

否则,如果要使用strsplit(),可以将第一个元素取整vapply()

vapply(strsplit(x, "-", fixed = TRUE), "[", "", 1)
# [1] "apple"  "banana" "orange" "tomato"
Run Code Online (Sandbox Code Playgroud)


Ven*_*Yao 5

我建议使用head而不是[在 R 中。

word <- c('apple-orange-strawberry','chocolate')
sapply(strsplit(word, "-"), head, 1)
# [1] "apple"     "chocolate"
Run Code Online (Sandbox Code Playgroud)


LMc*_*LMc 5

stringr1.5.0 引入了str_split_i轻松做到这一点:

library(stringr)

str_split_i(c('apple-orange-strawberry','chocolate'), "-", 1)
[1] "apple"     "chocolate"
Run Code Online (Sandbox Code Playgroud)

第三个参数表示您要提取的索引。另外一个新功能是您可以使用负值从右侧开始索引:

str_split_i(c('apple-orange-strawberry','chocolate'), "-", -1)
[1] "strawberry" "chocolate" 
Run Code Online (Sandbox Code Playgroud)