#r
#r
Вопрос:
Эксперты в R.
У меня есть два фрейма данных.
первый фрейм данных:
df1 <- c("xx", "bb", "zz")
второй фрейм данных:
df2 <- data.frame(A=c("xx", "be", "zz", "jj"), B=c("xyx, uu, zz", "uu, zbbz, zbz, ccc", "cc, zzx", "ddd"), C=c("bbbb", "yyy", "xxq", "ooo"), D=c("ooo", "yyy", "ccc", "zoz"))
Таким образом, df2 выглядит следующим образом:
A B C D
1 xx xyx, uu, zz bbbb ooo
2 be uu, zbbz, zbz, ccc yyy yyy
3 zz cc, zzx xxq ccc
4 jj ddd ooo zoz
Я хочу сопоставить x с y, чтобы получить новый фрейм данных. Просматривая ответы Stackoverflow, я узнал, как выполнить некоторое точное сопоставление. Однако в текущей ситуации я хочу выполнить как точное, так и частичное совпадение. Мне кажется, что «grep» может помочь, но я пока не могу заставить его работать в моем случае, пожалуйста, любезно помогите.
В df1 у меня есть три термина для сопоставления «xx», «bb» и «zz». Вместо поиска точных значений xx, bb, zz в df2. Я хочу проверить, можно ли найти эти термины в столбцах A и B df2, которые могут содержать точное и частичное совпадение.
Например, я бы рассмотрел
-
xx сопоставьте строку 1 (точное совпадение с A1)
-
bb соответствует только обеим строкам 2 (частичное совпадение с B2)
-
zz совпадение как в строке 1, так и в строке 3 (частичное совпадение с B1 и точное совпадение с A3, частичное совпадение также с B3),
-
Поскольку zz совпадает с двумя двумя элементами, я хочу сначала отсортировать тот, который имеет точное совпадение, в конечном фрейме данных, т. Е. Сначала отображается строка 3, затем строка 1.
-
В то время как строка 4 df2 не совпадала ни с чем в таблице, поэтому она не отображалась бы в конечном фрейме данных.
Наконец, я хочу получить фрейм данных, добавив соответствующий df2 в df1 следующим образом:
V1 A B C D
1 xx xx xyx, uu, zz bbbb ooo
2 bb be uu, zbbz, zbz, ccc yyy yyy
3 zz zz cc, zzx xxq ccc
4 zz xx xyx, uu, zz bbbb ooo
Можно ли использовать grep или sort в этом случае? Пожалуйста, укажите более разумный способ сделать это. Спасибо.
Комментарии:
1. Что касается первой части вашей проблемы, что будет в результатах фрейма данных? Координаты или согласованная строка?
Ответ №1:
Это должно привести вас к нужному результату:
dfrPerVal<-lapply(df1, function(dfrPartFor){
whereFoundA<-grep(dfrPartFor, df2$A, fixed=TRUE)
whereFoundB<-grep(dfrPartFor, df2$B, fixed=TRUE)
retval<-cbind(1=dfrPartFor, df[union(whereFoundA, whereFoundB),]
xmatch<-which((retval$A==dfrPartFor) | (retval$B==dfrPartFor))
if(length(xmatch) > 0)
{
retval<-rbind(retval[xmatch, ], retval[-xmatch, ])
}
return(retval)
})
finalResult<-do.call(rbind, dfrPerVal)
Без сомнения, есть лучшие решения…