Неправильно настроено значение для l oop (должно быть что-то вроде for(i in 1:n){do something}
). Кроме того, даже если вы исправите это, вы получите ошибку, связанную с тем фактом, что str_which
возвращает вектор переменной длины , указывающий положение каждого из найденных совпадений (и это может привести к несколько матчей). Таким образом, индексирование вектора в al oop здесь не сработает, потому что, когда у автора несколько совпадений, более чем одна запись будет сохранена в одном элементе, что приведет к ошибке.
Решите это, работая со списками, потому что списки могут содержать векторы произвольной длины. Индексируйте список с помощью двойных скобок: [[
.
library(stringr)
sampleDat <-
data.frame(var1 = c("Doe J, Maxwell M, Kim HE", "Cronauer R, Carst W, Theobald U", "Theobald U, Hey B, Joff S"),
var2 = c(1:3),
var3 = c("2016-01", "2016-03", "2017-05"))
# no need for list here. a simple vector will do
namesOfInterest <- c("Doe J", "Theobald U")
# initalize list
results <- vector("list", length = length(namesOfInterest))
# loop over list, saving output of `str_which` in each list element.
# seq_along(x) is similar to 1:length(x)
for (i in seq_along(namesOfInterest)) {
results[[i]] <- str_which(sampleDat$var1, namesOfInterest[i])
}
, что возвращает:
> results
[[1]]
[1] 1
[[2]]
[1] 2 3
Чтобы понять вышеприведенный вывод, является элемент ith
списка , results[[i]]
содержит вывод str_which(sampleDat$var1, namesOfInterest[i])
, где namesOfInterest[i]
всегда точно один автор. Однако длина results[[i]]
может быть больше единицы:
> sapply(results, length)
[1] 1 2
, что означает, что один автор может быть упомянут несколько раз. В приведенном выше примере sapply
считает длину каждого вектора в списке results
, показывая, что namesOfInterest[1]
имеет одну бумагу, а namesOfInterest[2]
имеет 2. `