2014-10-10 2 views
2

Я хотел бы знать, как использовать R для объединения строк в один набор данных.R - объединение/объединение строк в одном наборе данных

В настоящее время мои данные выглядит следующим образом:

Text 1  Text 2  Text 3  Text 4 
Bob  Aba   Abb   Abc 
Robert  Aba   Abb   Abc 
Fred  Abd   Abe   Abf 
Martin  Abg   Abh   Abi 

Если текст два и текст 3 являются одинаковыми для двух строк (как в строках 1 & 2) Я хотел бы сделать это в один ряд с более столбцы для других данных.

Text 1  Text 1a Text 2   Text 3  Text 4  Text 4a 
Bob   Robert  Aba   Abb   Abc  Abd 
Fred  NA   Abd   Abe   Abf  NA 
Martin  NA   Abg   Abh   Abi  NA 

я сделал что-то подобное с соединением двух отдельных наборов данных и объединение их с помощью присоединиться

join=join(Data1, Data2, by = c('Text2'), type = "full", match = "all") 

, но я не могу работать, как это сделать дубликаты в пределах одного набора данных.

Я думаю, что можно было бы использовать агрегат, но я не использовал его раньше, моя попытка была:

MyDataAgg=aggregate(MyData, by=list(MyData$Text1), c) 

, но когда я пытаюсь я получаю вывод, который выглядит следующим образом на резюме:

1 -none- numeric        
1 -none- numeric        
2 -none- numeric 

или это по структуре:

$ Initials    :List of 12505 
    ..$ 1 : int 62 
    ..$ 2 : int 310 
    ..$ 3 : int 504 

Я хотел бы также, чтобы иметь возможность объединить ряд используя совпадающие элементы двух переменных.

+0

Не могли бы Вы предоставить еще несколько деталей? Сколько столбцов вам нужно будет дублировать, только «Text1» и «Text4»? Ожидаете ли вы, что более двух копий каждой пары ID (количество потенциальных столбцов всего в два раза больше)? – ilir

+0

Почти во всех случаях было бы только две строки одинаковые - так да вдвое больше столбцов. Я не беспокоюсь о потере нечетного количества данных в маловероятном случае, если три строки одинаковы. Но это должно было бы не сломаться, если бы это произошло, поэтому я не мог этого сделать, сортируя данные и полагаясь на согласованность каждой другой записи. Есть также намного больше переменных, чем в моем примере. – Wol44

ответ

1

Я не думаю, что вы можете изменить или агрегат, потому что:

  1. Вы дублировали строки, которые соответствуют одному и тому же ключевому
  2. Вы не имеют одинаковое количество значение для каждого ключей: вы должны заполнить его с пропущенными значениями

Здесь аа ручной попытка с помощью by для обработки с помощью ключа, и rbind.fill агрегировать все вместе списка. Каждый шаг by создает однострочный data.frame, имеющий (Text2, Text3) в качестве ключа.

do.call(plyr::rbind.fill,by(dat,list(dat$Text2,dat$Text3), 
    function(d){ 
    ## change all other columns to a one row data.frame 
    dd <- as.data.frame(as.list(rapply(d[,-c(2,3)],as.character))) 
    ## the tricky part : add 1 to a name like Text1 to become Text11 , 
    ## this is import to join data.frames formed by by 
    names(dd) <- gsub('(Text[0-9]$)','\\11',names(dd)) 
    ## add key to to the row 
    cbind(unique(d[,2:3]),dd) 
    })) 

Text2 Text3 Text11 Text12 Text41 Text42 
1 Aba Abb Bob Robert Abc Abd 
2 Abd Abe Fred <NA> Abf <NA> 
3 Abg Abh Martin <NA> Abi <NA> 
+0

Спасибо за это. Тем не менее, я все еще не могу заставить его работать. Помимо изменения данных и текста есть ли какие-либо другие части, которые мне нужно будет изменить? – Wol44

+0

@ Wol44 что вы получаете как ошибку? Добавьте вопрос 'dput (head (data_frame))' к вопросу. – agstudy

Смежные вопросы