R: формирование кадра данных двумя конкретными способами, основанными на разделении и сопоставлении - PullRequest
1 голос
/ 02 июня 2011

У меня есть df1, как это:

    A                 B
1 xxx      B2341; A3456
2 yyy B2341; CC6x; GG63
3 zzz              CC6X
4 www              GG63
5 kkk              5634

Для получения df1 я использую следующие команды

 df1 <- data.frame(A=c("xxx", "yyy", "zzz", "www", "kkk"), B=c("B2341; A3456", "B2341; CC6x; GG63", "CC6X", "GG63", "5634"))

На первом шаге я хочу разделить все элементы (разделенные пробелом) в столбце B в таблицу следующим образом. Как я хочу сделать анализ на основе этого формата таблицы. Тем не менее, поскольку есть неравные элементы для каждой ячейки. Я хотел бы попросить вашей помощи, чтобы сделать это.

xxx B2341
xxx A3456
yyy B2341
yyy CC6X
yyy GG63
zzz CC6X
www GG63
kkk 5634

На втором шаге я хочу получить таблицу, основанную на результате сопоставления 2-го столбца df2, то есть и xxx, и yyy получили B2341 во 2-м столбце df2. yyy и zzz также получили CC6X; yyy и www также получили GG63.

Итак, я хотел бы иметь df с двумя столбцами, которые показывают совпадающие строки, такие как:

xxx yyy
yyy zzz
yyy www

Пожалуйста, помогите проинструктировать, как получить два кадра данных, основанных на моем df1 с R, более умным способом. Спасибо.

Ответы [ 2 ]

6 голосов
/ 02 июня 2011

Шаг первый:

library(reshape)
x <- melt((strsplit(as.character(df1$B), "; ")))
x <- data.frame("A"=df1[x$L1,1],"B"=x$value)

x:

  value L1 match
1 B2341  1   xxx
2 A3456  1   xxx
3 B2341  2   yyy
4  CC6x  2   yyy
5  GG63  2   yyy
6  CC6X  3   zzz
7  GG63  4   www
8  5634  5   kkk

Шаг 2:

y <- unique(merge(x,x[duplicated(x$B),],by="B")[2:3])
y[y$A.x != y$A.y,]

у

  A.x A.y
1 xxx yyy
3 yyy www

Примечание: шаг 2 не выходит точно так, как вы указали, потому что я считаю, что вы опечатали "CC6X" как "CC6x", если вы хотите, чтобы он игнорировал заглавные буквы, я бы порекомендовал x$B <- tolower(x$B)

0 голосов
/ 28 июля 2011

Это похоже на работу для пакета foreach. Я использую это каким-то образом для всего, что я пишу в R.

library(foreach)
foreach(a=df1$A, b=as.character(df1$B), .combine=rbind) %do% {
    data.frame(A=a, B=strsplit(b, "; ")[[1]])
}

Выход:

    A     B
1 xxx B2341
2 xxx A3456
3 yyy B2341
4 yyy  CC6x
5 yyy  GG63
6 zzz  CC6X
7 www  GG63
8 kkk  5634
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...