R точное и частичное совпадение в нескольких столбцах

#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, которые могут содержать точное и частичное совпадение.

Например, я бы рассмотрел

  1. xx сопоставьте строку 1 (точное совпадение с A1)

  2. bb соответствует только обеим строкам 2 (частичное совпадение с B2)

  3. zz совпадение как в строке 1, так и в строке 3 (частичное совпадение с B1 и точное совпадение с A3, частичное совпадение также с B3),

  4. Поскольку zz совпадает с двумя двумя элементами, я хочу сначала отсортировать тот, который имеет точное совпадение, в конечном фрейме данных, т. Е. Сначала отображается строка 3, затем строка 1.

  5. В то время как строка 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)
  

Без сомнения, есть лучшие решения…