我有一个列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)
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)
我会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)
我建议使用head而不是[在 R 中。
word <- c('apple-orange-strawberry','chocolate')
sapply(strsplit(word, "-"), head, 1)
# [1] "apple" "chocolate"
Run Code Online (Sandbox Code Playgroud)
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)