2014-08-13 7 views
1

У меня есть список строк, которые выглядят так:Разбор строки |

categories <- "|Music|Consumer Electronics|Mac|Software|"

Однако, я только хочу получить первую строку. В этом случае Music (без |). Я пробовал:

sub(categories, pattern = " |", replacement = "")

Однако это не дает мне желаемого результата. Любая рекомендация, как правильно разобрать мою строку?

Я ценю ваш ответ!

UPDATE

> dput(head(df)) 
structure(list(data.founded_at = c("01.06.2012", "26.10.2012", 
"01.04.2011", "01.01.2012", "10.10.2011", "01.01.2007"), data.category_list = c("|Entertainment|Politics|Social Media|News|", 
"|Publishing|Education|", "|Electronics|Guides|Coffee|Restaurants|Music|iPhone|Apps|Mobile|iOS|E-Commerce|", 
"|Software|", "|Software|", "|Curated Web|")), .Names = c("data.founded_at", 
"data.category_list"), row.names = c(NA, 6L), class = "data.frame") 
+1

несколько проблем: 1) Ваши аргументы для 'sub' находятся в неправильном порядке. 2) Вам нужно избежать '|' с 'pattern =" \\ | "' 3) 'sub' будет заменять только символы, а не разделять строки. –

ответ

3

Альтернативой этому может быть scan:

na.omit(scan(text = categories, sep = "|", what = "", na.strings = ""))[1] 
# Read 6 items 
# [1] "Music" 
1

Обратите внимание, что параметр в Сплите является регулярное выражение, так что использование split="|" не будет работать (если не указано фиксированной = TRUE, как это было предложено от Joran -thanks- в комментариях)

strsplit(categories,split="[|]")[[1]][2] 

чтобы применить это к кадру данных вы могли бы сделать это:

sapply(df$data.category_list, function(x) strsplit(x,split="[|]")[[1]][2]) 

Но это быстрее (см комментарии):

vapply(strsplit(df$data.category_list, "|", fixed = TRUE), `[`, character(1L), 2) 

(благодаря Ананда Mahto)

+2

'split =" | "' будет работать нормально, если вы укажете 'fixed = TRUE'. – joran

+0

И, если вы используете strsplit, который возвращает список, вы можете вызвать unlist в выражении @momobo. Это вернет вектор. – lawyeR

+0

@momobo Thx для вашего ответа! Как это сделать на кадре данных? – mrquad