2017-02-17 26 views
1

Я хотел бы сообщить описательные значения в таблице (я уверен, что они должны быть в таблице, а не в фигуре). Данные поступают из 3-факторного эксперимента, так что таблица, что я в состоянии производить с xtable (я это делаю в Rmarkdown и Knitr и никогда не использовали LATEX) содержит одну строку на значения данных по формату:опускают записи клеток в xtable уценки

группа | состояние | тип | Значение

Когда все линии печатаются ниже друг друга, это не очень удобными для чтения, например, запись «группы» остается неизменной на протяжении 10 строк. Есть ли возможность просто распечатать его в первый раз (в первой строке), а затем опустить его, пока «группа» не изменится на следующую группу (только напечатайте ее в строке 11)? Моя таблица должна иметь формат apa, поэтому для окончательной печати я использую либо rapa :: apa (mytable), либо papaja :: apa_table (mytable). Любая помощь будет оценена, спасибо!

ответ

1

Существует несколько различных способов сделать это.

library(data.table) 

dt = data.table("Group" = c(rep("A",4),rep("B",4)), "value" = rep(1:4, each = 2)) 
knitr::kable(dt) 

> dt 
    Group value 
1:  A  1 
2:  A  1 
3:  A  2 
4:  A  2 
5:  B  3 
6:  B  3 
7:  B  4 
8:  B  4 

Мы можем удалить дубликаты всех строк

knitr::kable(dt[!duplicated(dt),]) 

|Group | value| 
|:-----|-----:| 
|A  |  1| 
|A  |  2| 
|B  |  3| 
|B  |  4| 

Или мы можем удалить дубликаты в соответствии с конкретными строками

knitr::kable(unique(dt,by = c("Group"))) 
|Group | value| 
|:-----|-----:| 
|A  |  1| 
|B  |  3| 

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

knitr::kable(dt[unique(dt,by = c("Group")),.(Group, value), mult = "first"]) 
|Group | value| 
|:-----|-----:| 
|A  |  1| 
|B  |  3| 

knitr::kable(dt[unique(dt,by = c("Group")),.(Group, value), mult = "last"]) 
|Group | value| 
|:-----|-----:| 
|A  |  2| 
|B  |  4| 

EDIT

Чтобы не печатать значения в конкретной группе, которые были продублированы

dt$Group = ifelse(duplicated(dt$Group),"",dt$Group) 
knitr::kable(dt) 
|Group | value| 
|:-----|-----:| 
|A  |  1| 
|  |  1| 
|  |  2| 
|  |  2| 
|B  |  3| 
|  |  3| 
|  |  4| 
|  |  4| 
+0

Спасибо за ваши предложения! Это почти то, что мне нужно. В вашей первоначальной таблице dt мне бы хотелось, чтобы первая строка содержала «A», а затем она не печаталась, но значения печатаются, поэтому в столбце значений она все еще говорит «1 1 2 2», что три последние записи не имеют «A» в столбце «Группа». Только в строке 5 «B» следует напечатать, а в строках 6,7 и 8 снова «B» следует опустить, но «3 3 4 4» должен оставаться. Поэтому я не хочу потерять какие-либо строки, просто запись в некоторых ячейках в столбце Group. Спасибо за вашу помощь! – lilla

+0

@lilla Новый код будет делать то, что вы ищете – Kristofersen

+0

К сожалению, я был занят другими вещами, но редактировать то, что я искал, спасибо! – lilla

0

Вы можете использовать duplicated функции с отрицанием (!), чтобы сохранить значения «группы» только на переходах, но будьте осторожны, что есть действительно не приводит к потере информации из других столбцов (если они необходимы). В демо-дансе мы сохраняем только переходы переменной cyl.

mtcarsSubset = mtcars[,1:5] 

knitr::kable(mtcarsSubset) 

#|     | mpg| cyl| disp| hp| drat| 
#|:-------------------|----:|---:|-----:|---:|----:| 
#|Mazda RX4   | 21.0| 6| 160.0| 110| 3.90| 
#|Mazda RX4 Wag  | 21.0| 6| 160.0| 110| 3.90| 
#|Datsun 710   | 22.8| 4| 108.0| 93| 3.85| 
#|Hornet 4 Drive  | 21.4| 6| 258.0| 110| 3.08| 
#|Hornet Sportabout | 18.7| 8| 360.0| 175| 3.15| 
#|Valiant    | 18.1| 6| 225.0| 105| 2.76| 
#|Duster 360   | 14.3| 8| 360.0| 245| 3.21| 
#|Merc 240D   | 24.4| 4| 146.7| 62| 3.69| 
#|Merc 230   | 22.8| 4| 140.8| 95| 3.92| 
#|Merc 280   | 19.2| 6| 167.6| 123| 3.92| 
#|Merc 280C   | 17.8| 6| 167.6| 123| 3.92| 
#|Merc 450SE   | 16.4| 8| 275.8| 180| 3.07| 
#|Merc 450SL   | 17.3| 8| 275.8| 180| 3.07| 
#|Merc 450SLC   | 15.2| 8| 275.8| 180| 3.07| 
#|Cadillac Fleetwood | 10.4| 8| 472.0| 205| 2.93| 
#|Lincoln Continental | 10.4| 8| 460.0| 215| 3.00| 
#|Chrysler Imperial | 14.7| 8| 440.0| 230| 3.23| 
#|Fiat 128   | 32.4| 4| 78.7| 66| 4.08| 
#|Honda Civic   | 30.4| 4| 75.7| 52| 4.93| 
#|Toyota Corolla  | 33.9| 4| 71.1| 65| 4.22| 
#|Toyota Corona  | 21.5| 4| 120.1| 97| 3.70| 
#|Dodge Challenger | 15.5| 8| 318.0| 150| 2.76| 
#|AMC Javelin   | 15.2| 8| 304.0| 150| 3.15| 
#|Camaro Z28   | 13.3| 8| 350.0| 245| 3.73| 
#|Pontiac Firebird | 19.2| 8| 400.0| 175| 3.08| 
#|Fiat X1-9   | 27.3| 4| 79.0| 66| 4.08| 
#|Porsche 914-2  | 26.0| 4| 120.3| 91| 4.43| 
#|Lotus Europa  | 30.4| 4| 95.1| 113| 3.77| 
#|Ford Pantera L  | 15.8| 8| 351.0| 264| 4.22| 
#|Ferrari Dino  | 19.7| 6| 145.0| 175| 3.62| 
#|Maserati Bora  | 15.0| 8| 301.0| 335| 3.54| 
#|Volvo 142E   | 21.4| 4| 121.0| 109| 4.11| 


knitr::kable(mtcarsSubset[!duplicated(mtcarsSubset$cyl),]) 

#|     | mpg| cyl| disp| hp| drat| 
#|:-----------------|----:|---:|----:|---:|----:| 
#|Mazda RX4   | 21.0| 6| 160| 110| 3.90| 
#|Datsun 710  | 22.8| 4| 108| 93| 3.85| 
#|Hornet Sportabout | 18.7| 8| 360| 175| 3.15| 
+0

Спасибо за ваш ответ, это почти то, что я искал, мне очень жаль, что я не был способный лучше объяснить мою проблему: вместо того, чтобы пропустить все промежутки между ними, я хотел бы опустить значение цил, если он такой же, как в строке выше. В конце концов, столбец цилиндра shoud имеет только номер в нем, если он относится к новому количеству цилиндров, остальная часть таблицы должна быть напечатана, как она выше, без изменений. Надеюсь, вы понимаете, что я имею в виду? Или, может быть, представьте себе, я бы сортировал таблицу по циллу, чтобы фактическое количество цил было напечатано только тогда, когда начинается новая группа цилиндров ... – lilla