2015-10-21 4 views
0

У меня есть еще одна сложная задача, которую я не могу освоить на данный момент. Она имеет дело с dataframes в R.Как преобразовать и включить фрейм данных в другой фрейм данных

Скажем, у меня есть кадр данных выглядит как:

original = data.frame(Male = c(rep(1,3),rep(2,4),rep(3,2)), 
        SongNumber = c(1,2,3,1,2,3,4,1,2), 
        SongType = c("16a","16b","17a","24a","24b","25d","24f","5e","5e"), 
        Start = c(0.5,16.1,24.2,0.9,10.1,18.9,0.7,0.6,12.2), 
        RecordFile = c(rep("A1",3),rep("B1",3),"B2",rep("C1",2))) 
original 

и другой кадр данных, содержащий конкретный слог порядок каждого типа песни:

additional = data.frame(SongType = c("16a","16b","17a","24a"), 
        Syll1 = c(4,4,3,16), 
        Syll2 = c(4,4,3,16), 
        Syll3 = c(84,84,3,3), 
        Syll4 = c(3,3,3,16), 
        Syll5 = c(16,16,3,3), 
        Syll6 = c(16,16,NA,4), 
        Syll7 = c(NA,16,NA,NA), 
        Syll8 = c(NA,16,NA,NA), 
        Syll9 = c(NA,3,NA,NA), 
        Syll10 = c(NA,1,NA,NA)) 
additional 

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

aim = data.frame(Male = c(rep(1,21),rep(2,9),rep(3,2)), 
      SongNumber = c(rep(1,6),rep(2,10),rep(3,5),rep(1,6),2,3,4,1,2), 
      SongType = c(rep("16a",6),rep("16b",10),rep("17a",5),rep("24a",6),"24b","25d", 
          "24f","5e","5e"), 
      Start = c(rep(0.5,6),rep(16.1,10),rep(24.2,5),rep(0.9,6),10.1,18.9,0.7,0.6, 
         12.2), 
      RecordFile = c(rep("A1",21),rep("B1",8),"B2",rep("C1",2)), 
      SyllOrder = c(4,4,84,3,16,16,4,4,84,3,16,16,16,16,3,1,3,3,3,3,3,16,16,3,16,3,4, 
          NA,NA,NA,NA,NA)) 
aim 

До сих пор я не вижу, как функции, такие как слияние может помочь: слияние только добавить столбцы dataframe2 к dataframe1 на основе общего столбца между двумя кадрами данных. Это не заставляет dataframe1 добавлять строки соответственно!

+0

ну, ответ, предоставленный @Thierry, что сначала преобразовать 'дополнительный' в длинный формат не удалось найти в вопросе [Как присоединить (объединить) кадры данных (внутренний, внешний, левый, правый)?] – KrisAnathema

ответ

3

Чтобы добраться до нужного выхода, вы можете сделать:

library(data.table) 
additional2 <- melt(setDT(additional), id="SongType", na.rm=TRUE)[, .(SyllOrder = toString(value)), by = SongType] 

aim2 <- setDT(original)[additional2, SyllOrder := i.SyllOrder, on="SongType" 
         ][, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))), 
          by=setdiff(names(original),"SyllOrder")] 

В качестве альтернативы на последней стадии, вы также можете использовать:

aim2 <- additional2[original, on="SongType" 
        ][, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))), 
         by=setdiff(names(original),"SyllOrder")] 

Оба результата в:

> aim3 
    Male SongNumber SongType Start RecordFile SyllOrder 
1: 1   1  16a 0.5   A1   4 
2: 1   1  16a 0.5   A1   4 
3: 1   1  16a 0.5   A1  84 
4: 1   1  16a 0.5   A1   3 
5: 1   1  16a 0.5   A1  16 
6: 1   1  16a 0.5   A1  16 
7: 1   2  16b 16.1   A1   4 
8: 1   2  16b 16.1   A1   4 
9: 1   2  16b 16.1   A1  84 
10: 1   2  16b 16.1   A1   3 
11: 1   2  16b 16.1   A1  16 
12: 1   2  16b 16.1   A1  16 
13: 1   2  16b 16.1   A1  16 
14: 1   2  16b 16.1   A1  16 
15: 1   2  16b 16.1   A1   3 
16: 1   2  16b 16.1   A1   1 
17: 1   3  17a 24.2   A1   3 
18: 1   3  17a 24.2   A1   3 
19: 1   3  17a 24.2   A1   3 
20: 1   3  17a 24.2   A1   3 
21: 1   3  17a 24.2   A1   3 
22: 2   1  24a 0.9   B1  16 
23: 2   1  24a 0.9   B1  16 
24: 2   1  24a 0.9   B1   3 
25: 2   1  24a 0.9   B1  16 
26: 2   1  24a 0.9   B1   3 
27: 2   1  24a 0.9   B1   4 
28: 2   2  24b 10.1   B1  NA 
29: 2   3  25d 18.9   B1  NA 
30: 2   4  24f 0.7   B2  NA 
31: 3   1  5e 0.6   C1  NA 
32: 3   2  5e 12.2   C1  NA 
+0

Спасибо! Это выглядит умным и замечательным, но я получаю сообщение об ошибке, когда я запускаю его в R. Вот сообщение: «Ошибка в' .data.table' (setDT (original), дополнительная2, ': =' (SyllOrder,: unused argument (on = "SongType") " – KrisAnathema

+0

Какая версия' data.table' у вас есть? Вам нужен последний из CRAN (т.е. * v1.9.6 *) – Jaap

+1

У меня был * v1.9.4 *! Я обновил он и он отлично работает сейчас. Большое спасибо! – KrisAnathema

1

Вам необходимо преобразовать additional в длинный формат. Затем вы можете объединить их.

library(dplyr) 
library(tidyr) 
additional %>% 
    gather("Syllable", "SyllOrder", -SongType) %>% 
    inner_join(original, by = "SongType") 
+0

Спасибо @Thierry! Отлично, именно то, что мне нужно! – KrisAnathema

+0

@KrisAnathema Это не дает вывод, который вы указали в наборе данных 'aim'. – Jaap

+0

Да, это почти так. Он просто добавляет колонку Syllable и SyllOrder с NA. Но я могу удалить их потом! – KrisAnathema

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