2017-02-14 5 views
0

Как я создать таблицу со следующими данными:Таблица с несколькими зависимыми переменными

Initial Таблица данных:

enter image description here

столик Результат:

enter image description here

Здесь это код, который легко вводится в R (который я прочитал бы из файла csv во время работы):

Date = c(20170101,20170101,20170102,20170102,20170102,20170102,20170103) 
Person = c("Adam","Adam","Adam","Ben","Ben","Ben","Ben") 
Fruit = c("Apple", "Pear","Bananna","Blueberry","Cherry","Grape","Grape") 
z= data.frame(Date,Person,Fruit) 
+1

как правило, вы оба должны показать выход и описать то, что правила перевода с вх ut для вывода. Я удаляю тег data.table, так как вы должны использовать его только для вопросов о пакете, а не просто для того, чтобы привлечь внимание людей, которые следуют за тегом или запросить ответ с этим пакетом, даже не установив его самостоятельно ... – Frank

+0

логика выглядит нормально, но мы должны предупредить об 1) наличии пустых пространств, созданных в кадрах данных, и 2) укладке нескольких элементов в одно векторное положение. Это возможно, но вы будете работать против зерна –

+0

Попробуйте это сейчас 'reshape2 :: dcast (z, Person ~ Date, value.var =" Fruit ", fun = toString)' –

ответ

1

tapply() функция может организовать значения в объект матрицы с помощью функции c. Значения получают инкапсулированные в списках:

with(z, tapply(Fruit, list(Person,Date), FUN=c)) 

    20170101 20170102 20170103 
Adam Character,2 "Bananna" NULL  
Ben NULL  Character,3 "Grape" 

Вы можете отобразить эту матрицу объект с Pander:

library(pander) 
panderOptions('keep.line.breaks', TRUE) 
mytable <- with(z, tapply(Fruit, list(Person,Date), FUN=c)) 
pandoc.table(mytable, style="multiline") 

---------------------------------------------------------- 
    &nbsp; 20170101   20170102   20170103 
---------- ----------- ------------------------ ---------- 
**Adam** Apple, Pear   Bananna    NULL 

**Ben**  NULL  Blueberry, Cherry, Grape Grape 
---------------------------------------------------------- 

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

+----------+-------------+--------------------------+------------+ 
| Person | 20170101 |   20170102   | 20170103 | 
+==========+=============+==========================+============+ 
| Adam | Apple, Pear |   Bananna   |   | 
+----------+-------------+--------------------------+------------+ 
| Ben |    | Blueberry, Cherry, Grape | Grape | 
+----------+-------------+--------------------------+------------+ 

Если вы используете paste0 обрушением вы можете удалить запятые и использовать символы новой строки вместо:

mytable <- with(z, tapply(Fruit, list(Person,Date), FUN=paste0, collapse="\n")) 

Структура матрицы теперь отличается, причем каждая запись будучи символьное значение длины-1, но что же тогда получить отображаются в таблице pandoc с каждым фруктам на одной строке:

pandoc.table(mytable, style="multiline") # or style ="grid" as above 
#------------ 
------------------------------------------- 
    &nbsp; 20170101 20170102 20170103 
---------- ---------- ---------- ---------- 
**Adam** Apple  Bananna  NA  
       Pear       

**Ben**  NA  Blueberry Grape 
         Cherry    
         Grape    
------------------------------------------- 
Смежные вопросы