Сопоставление строк в одном фрейме данных со столбцами во втором

Образец данных:

t1 <- data.frame(
  CName=c("334","5as4","ggg","bbb"), 
  D1=c(1," ",3,1), 
  D2=c(3,4,5,5)
)

t2 <- data.frame(
  PName=c("zz","yy","xx","ww"), 
  `334`=c(5,6,3,5), 
  "ggg"=c(7,5,4,3), 
  `5as4`=c(9,9,1,1),
  check.names=FALSE
)

Производство:

t1
  CName D1 D2
1   334  1  3
2  5as4     4
3   ggg  3  5
4   bbb  1  5

t2
  PName 334 ggg 5as4
1    zz   5   7    9
2    yy   6   5    9
3    xx   3   4    1
4    ww   5   3    1

Я хочу сопоставить столбец t1$CName с заголовками столбцов t2.

Желаемый результат:

   PName  334  ggg  5as4
     D1   1    3     
     D2   3    5    4
1    zz   5    7    9
2    yy   6    5    9
3    xx   3    4    1
4    ww   5    3    1

person psiu    schedule 11.07.2012    source источник
comment
Как вы думаете, почему проблема с памятью? Какая у вас ошибка? Насколько велики ваши фреймы данных?   -  person Andrie    schedule 11.07.2012
comment
@Andrie, мой набор данных имеет размер около 1000, так как мой компьютер работает медленно, я беспокоюсь, что проблема с памятью. Если основываться на вашем опыте, это не проблема. Не могли бы вы научить меня, как это сделать в целом? Думаю, я мог бы использовать метод, предложенный Gsee ранее (stackoverflow.com/questions/11424232). Но я не знаю, как изменить его, чтобы можно было добавлять новые строки на основе результатов сопоставления. Не могли бы вы помочь мне?   -  person psiu    schedule 11.07.2012
comment
Я полностью переписал ваш вопрос таким образом, чтобы он имел смысл, и опубликовал ответ, с которым R легко справится даже на старой машине.   -  person Andrie    schedule 11.07.2012


Ответы (1)


Мне кажется, вы действительно хотите объединить транспонирование t1 с t2:

Шаг 1. Создайте транспонированную копию таблицы t1:

tt1 <- as.data.frame(t(t1[, -1]), stringsAsFactors=FALSE)
names(tt1) <- t1[, 1]
tt1$PName = rownames(tt1)

tt1
   334 5as4 ggg bbb PName
D1   1        3   1    D1
D2   3    4   5   5    D2

Шаг 2. Объединение

merge(tt1, t2, all=TRUE, sort=FALSE)

  334 5as4 ggg PName  bbb
1   1        3    D1    1
2   3    4   5    D2    5
3   5    9   7    zz <NA>
4   6    9   5    yy <NA>
5   3    1   4    xx <NA>
6   5    1   3    ww <NA>

Шаг 3. Теперь все, что вам нужно сделать, это удалить ненужные столбцы.

  334 5as4 ggg PName
1   1        3    D1
2   3    4   5    D2
3   5    9   7    zz
4   6    9   5    yy
5   3    1   4    xx
6   5    1   3    ww

Даже для вашего заявленного размера данных в 1000 записей это не должно быть проблемой для R.

person Andrie    schedule 11.07.2012
comment
Большое спасибо. Анализ проходит очень быстро. - person psiu; 11.07.2012