R точное и частичное совпадение в нескольких столбцах - PullRequest
3 голосов
/ 30 мая 2011

Эксперты в Р.

У меня есть два кадра данных.

датафрейм один:

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 и точное совпадение с А3, частичное совпадение с 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 Ответ

2 голосов
/ 30 мая 2011

Это должно привести вас туда:

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)

Нет сомнений, что лучшие решения ...

...