Одним из вариантов является использование word
из stringr
с аргументом sep
library(stringr)
word(string, 1, sep = ",")
#[1] "A" "B" "A"
word(string, 3, sep = ",")
#[1] "some text" "some other text" "yet another one"
Поскольку производительность word
является худшей среди всех, я обнаружил другой вариант, использующийрегулярное выражение в базе R.
#Get 1st element
sub("(?:[^,],){0}([^,]*).*", "\\1",string)
#[1] "A" "B" "A"
#Get 3rd element
sub("(?:[^,],){2}([^,]*).*", "\\1",string)
#[1] "some text" "some other text" "yet another one"
Здесь нужно сопоставить две группы.Первый соответствует любым символам, которые не являются запятой, за которой следует запятая n
раз, а затем снова соответствует другому набору символов, которые не являются запятыми.Первая группа не захвачена (?:
), а вторая группа захвачена и возвращена.Также обратите внимание, что число в скобках ({}
) должно быть на единицу меньше нужного нам слова.Таким образом, {0}
возвращает 1-е слово, а {2}
возвращает 3-е слово.
Тест
string <- c("A,1,some text,200","B,2,some other text,300","A,3,yet another one,100")
string <- rep(string, 1e5)
library(microbenchmark)
microbenchmark(
tmfmnk_sapply = sapply(strsplit(string, ","), function(x) x[1]),
tmfmnk_tstrsplit = tstrsplit(string, ",")[[1]],
avid_useR_sapply = sapply(strsplit(string, ","), '[', 1),
avid_useR_str_split = str_split(string, ",", simplify = TRUE)[,1],
Ronak_Shah_word = word(string, 1, sep = ","),
Ronak_Shah_sub = sub("(?:[^,],){0}([^,]*).*", "\\1",string),
G_Grothendieck ={DF <- read.table(text = string, sep = ",",as.is = TRUE);DF[[1]]},
times = 5
)
#Unit: milliseconds
# expr min lq mean median uq max neval
# tmfmnk_sapply 1629.69 1641.61 2128.14 1834.99 1893.43 3640.96 5
# tmfmnk_tstrsplit 1269.94 1283.79 1286.29 1286.68 1290.76 1300.30 5
# avid_useR_sapply 1445.40 1447.64 1555.76 1498.14 1609.52 1778.13 5
#avid_useR_str_split 324.68 332.28 332.30 333.97 334.01 336.54 5
# Ronak_Shah_word 6571.29 6810.92 6956.20 6930.86 7217.26 7250.69 5
# Ronak_Shah_sub 349.76 354.77 356.91 358.91 359.17 361.94 5
# G_Grothendieck 354.93 358.24 364.43 362.24 367.79 378.94 5
Я не включил решение Кристофа, так как не ясномне, как это будет работать для переменных n
.Например, для 3-й позиции, для 4-й позиции и т. Д.