grepl() и lapply для заполнения пропущенных значений

У меня есть следующие данные в качестве примера:

fruit.region <- data.frame(full =c("US red apple","bombay Asia mango","gold kiwi New Zealand"), name = c("apple", "mango", "kiwi"), country = c("US","Asia","New Zealand"), type = c("red","bombay","gold"))

Я хотел бы, чтобы R мог просматривать другие элементы в столбце «полный» (имя), которые не имеют значений для «имя», «страна» и «тип», и видеть, соответствуют ли они другим элементам. Например, если бы в четвертом ряду у full было слово «bombay US mango», можно было бы определить, что страна должна читаться как US, бомбей должен быть под типом, а манго — под названием.

Это то, что у меня есть до сих пор, которое просто определяет (логически), где элементы совпадают:

new.entry <- c("bombay US mango")
split.new.entry <- strsplit(new.entry, " ")

lapply(split.new.entry, function(x){
 check = grepl(x, fruit.region, ignore.case=TRUE)
 print(check)
})

Я немного застопорился. Я прочитал несколько сообщений о регулярных выражениях и справочные руководства по r на grepl, но не могу найти отличное решение. То, что у меня есть, не полностью идентифицирует логический вектор «совпадения», поэтому я не могу подмножить и использовать оператор if для объединения разных элементов. В идеале я хотел бы иметь возможность заменить эти элементы в форме data.table, так как мой fruit.region фактически будет в таблице данных. У кого-нибудь есть предложения по лучшему подходу?


person Rob.C    schedule 24.11.2015    source источник
comment
Пожалуйста, отформатируйте фрейм входных данных в виде таблицы, а затем покажите нам точный результат, который вы хотите.   -  person Tim Biegeleisen    schedule 24.11.2015


Ответы (1)


Использование функции str_detect из библиотеки stringr. Это дает список, готовый к rbind:

library(stringr)
addnewrow <- function(newfruit){
  z<-lapply(fruit.region[,2:4], function(x) x[str_detect(new.entry, x)])
  z$full <- newfruit
  z
}
addnewrow(new.entry)

$name
[1] "mango"

$country
[1] "US"

$type
[1] "bombay"

$full
[1] "bombay US mango"

Следующий шаг будет зависеть от желаемого результата — если вы хотите добавить только один, попробуйте:

rbind(fruit.region, addnewrow(new.entry))

Если у вас много:

z <- do.call(rbind, lapply(c(new.entry, new.entry), addnewrow))
rbind(fruit.region, z)

NB убедитесь, что ваши столбцы являются первыми символами:

fruit.region[] <- lapply(fruit.region, as.character)
person jeremycg    schedule 24.11.2015
comment
Спасибо, Джереми, это полезно. Одно продолжение: кажется, я понял это при добавлении значений, когда new.entry является одной строкой. Когда я пытаюсь добавить что-то вроде: new.entry ‹- c(apple, Asia, gold,mango US bombay,kiwi, Asia, red), а затем запускаю это через: z ‹- do.call(rbind, lapply(new.entry, addnewrow)) rbind(fruit.region, z) В итоге я получаю выходные данные, которые не помещают новые элементы в соответствующие категории. Вы знаете, что я делаю неправильно?? Спасибо - person Rob.C; 25.11.2015
comment
Вы должны пометить принятые ответы как правильные и, возможно, также проголосовать за них. Людям нравится получать вознаграждение за помощь. - person Mike Wise; 13.01.2016