Как перебирать список символов R для изменения каждого элемента, сохраняя все символы до запятой и включая один символ после запятой - PullRequest
0 голосов
/ 06 июня 2019

У меня есть список R ок.90 символьных векторов (представляющих 90 документов), каждый из которых содержит несколько имен авторов.В качестве средства обрезки (или нормализации, что у вас) имен я хотел бы удалить все символы после пробела и первый символ после запятой в каждом элементе.Так, например, «Смит, Джо» станет «Смит, Дж» (или «Смит Дж» будет в порядке).

1) Я пытался использовать lapply с str_sub, но я не могу указать, чтобы один символ оставался после запятой (каждый элемент имеет разную длину символа).2) Я также попытался использовать lapply, чтобы разделить запятую и разделить фамилию и фамилию на отдельные элементы, затем с помощью modify_depth для применения str_sub, но я не могу понять, как конкретно использовать str_sub только для второго элемента.

Поддельный образец для репликации проблемы.

doc1 = c("King, Stephen", "Martin, George")

doc2 = c("Clancy, Tom", "Patterson, James", "Stine, R.L.")

author = list(doc1,doc2)

Что я пробовал:

myfun1 = function(x,arg1){str_split(x, ", ")}

author = lapply(author, myfun1)

myfun2 = function(x,arg1){str_sub(x, end = 1L)}

f2 = modify_depth(author, myfun2, .depth = 2)

f2

[[1]]
[[1]][[1]]
[1] "K" "S"

[[1]][[2]]
[1] "M" "G"

В конечном счете, я надеюсь после применения решения, включая, возможно, использованиеunite (), результат будет следующим:

[[1]]
[[1]][[1]]
[1] "King S"

[[1]][[2]]
[1] "Martin G"

1 Ответ

0 голосов
/ 06 июня 2019
lapply( author, function(x) gsub( "(^.*, [A-Z]).*$", "\\1", x))

# [[1]]
# [1] "King, S"   "Martin, G"
# 
# [[2]]
# [1] "Clancy, T"    "Patterson, J" "Stine, R"    

Что он делает:
lapply зацикливается на списке авторов
gsub заменяет часть элементов векторов, определяемых регулярным выражением "(^.*, [A-Z]).*$", на первую группу (часть между круглыми скобками).
регулярное выражение "(^.*, [A-Z]).*$" помещает все с начала ^.*, до (и включая) первого 'запятой, captal' , [A-Z] в группу.

...