R: преобразовать формат данных в удобочитаемый формат

У меня есть данные о видах в аккуратном формате данных. Для включения в отчет мне нужно уменьшить ширину таблицы, указав высшие порядки (царство, тип, класс и т. д.) только один раз для каждой группы.

В настоящее время у меня есть:

R: преобразовать формат данных в удобочитаемый формат

... и нужно получить что-то вроде: R: преобразовать формат данных в удобочитаемый формат

... или что-то вроде:

R: преобразовать формат данных в удобочитаемый формат

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

Этот список длинный, поэтому он должен быть основан на сценарии. Я рассматривал использование dplyr, но не вижу способа добиться этого.

Ниже приведены воспроизводимые примеры данных, если это необходимо.

exampledata <- structure(list(KINGDOM = c("Animalia", "Animalia", "Animalia", 
                                   "Animalia", "Animalia", "Animalia", "Animalia", "Animalia", "Animalia", 
                                   "Animalia", "Animalia", "Animalia"), PHYLYM = c("Chordata", "Chordata", 
                                                                                   "Chordata", "Chordata", "Chordata", "Chordata", "Chordata", "Chordata", 
                                                                                   "Chordata", "Chordata", "Chordata", "Chordata"), CLASS = c("Amphibia", 
                                                                                                                                              "Amphibia", "Amphibia", "Amphibia", "Amphibia", "Aves", "Aves", 
                                                                                                                                              "Aves", "Aves", "Aves", "Aves", "Aves"), ORDER = c("Anura", "Anura", 
                                                                                                                                                                                                 "Anura", "Anura", "Anura", "Accipitriformes", "Ciconiiformes", 
                                                                                                                                                                                                 "Gruiformes", "Passeriformes", "Passeriformes", "Pelecaniformes", 
                                                                                                                                                                                                 "Pelecaniformes"), FAMILY = c("Ranidae", "Ranidae", "Rhacophoridae", 
                                                                                                                                                                                                                               "Rhacophoridae", "Rhacophoridae", "Accipitridae", "Ciconiidae", 
                                                                                                                                                                                                                               "Gruidae", "Muscicapidae", "Muscicapidae", "Threskiornithidae", 
                                                                                                                                                                                                                               "Threskiornithidae"), SCIENTIFICNAME = c("Hylarana attigua", 
                                                                                                                                                                                                                                                                        "Hylarana taipehensis", "Philautus", "Polypedates leucomystax", 
                                                                                                                                                                                                                                                                        "Theloderma asperum", "Aviceda jerdoni", "Leptoptilos javanicus", 
                                                                                                                                                                                                                                                                        "Antigone antigone", "Cyanoptila cyanomelana", "Cyornis hainanus", 
                                                                                                                                                                                                                                                                        "Pseudibis davisoni", "Thaumatibis gigantea"), OTHERDATA = c("XYZ", 
                                                                                                                                                                                                                                                                                                                                     "ABC", "XYZ", "ABC", "XYZ", "XYZ", "ABC", "XYZ", "ABC", "ABC", 
                                                                                                                                                                                                                                                                                                                                     "XYZ", "XYZ")), row.names = c(NA, 12L), class = "data.frame")

Включайте данные в воспроизводимом формате, который можно копировать и вставлять. Скриншоты кода/данных никогда не бывают полезными, так как извлечь данные из изображения непросто. Может быть полезно взглянуть на то, как предоставить минимальный воспроизводимый пример/попытка.

Maurits Evers 09.04.2019 04:41

Вы можете попробовать пакет gt для его меток строк: github.com/rstudio/gt Это также, вероятно, можно сделать в dplyr, используя mutate_all и что-то, чтобы изменить все значения на пустые, если следующая запись такая же.

Jon Spring 09.04.2019 04:43

Вы можете использовать collapse_rows() из кабеля: haozhu233.github.io/kableExtra/awesome_table_in_html.html

Paul 09.04.2019 04:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Как правило, удалять данные - плохая идея, однако я вижу вариант использования.

Если у вас уже есть данные в правильном порядке, вы можете сделать что-то вроде этого:

iris %>% 
  mutate(Species = if_else(duplicated(Species),"", as.character(Species)))

Обратите внимание, что as.character() требуется только потому, что Species является фактором в этом наборе данных.


Отредактируйте, например, данные:

exampledata %>% 
  mutate_at(vars("KINGDOM", "PHYLYM", "CLASS","ORDER", "FAMILY", "SCIENTIFICNAME"), ~ if_else(duplicated(.x),"", as.character(.x)) )

дает такую ​​таблицу:

    KINGDOM   PHYLYM    CLASS           ORDER            FAMILY          SCIENTIFICNAME OTHERDATA
1  Animalia Chordata Amphibia           Anura           Ranidae        Hylarana attigua       XYZ
2                                                                  Hylarana taipehensis       ABC
3                                                 Rhacophoridae               Philautus       XYZ
4                                                               Polypedates leucomystax       ABC
5                                                                    Theloderma asperum       XYZ
6                        Aves Accipitriformes      Accipitridae         Aviceda jerdoni       XYZ
7                               Ciconiiformes        Ciconiidae   Leptoptilos javanicus       ABC
8                                  Gruiformes           Gruidae       Antigone antigone       XYZ
9                               Passeriformes      Muscicapidae  Cyanoptila cyanomelana       ABC
10                                                                     Cyornis hainanus       ABC
11                             Pelecaniformes Threskiornithidae      Pseudibis davisoni       XYZ
12                                                                 Thaumatibis gigantea       XYZ

Спасибо, это работает хорошо. HTML-эквивалентом этого является collapse_rows() от kableExtra.

gisol 09.04.2019 05:12

Вместо пустых ячеек, если вы хотите уменьшить данные, я бы предложил group_by более высокие порядки и сохранил другие данные в виде строки, разделенной запятыми.

library(dplyr)

exampledata %>%
   group_by(KINGDOM, PHYLYM, CLASS, ORDER, FAMILY) %>%
   summarise_at(vars(SCIENTIFICNAME, OTHERDATA), toString)


#   KINGDOM  PHYLYM   CLASS    ORDER         FAMILY         SCIENTIFICNAME                                 OTHERDATA   
#  <chr>    <chr>    <chr>    <chr>         <chr>          <chr>                                          <chr>       
#1 Animalia Chordata Amphibia Anura         Ranidae        Hylarana attigua, Hylarana taipehensis         XYZ, ABC    
#2 Animalia Chordata Amphibia Anura         Rhacophoridae  Philautus, Polypedates leucomystax, Theloderm… XYZ, ABC, X…
#3 Animalia Chordata Aves     Accipitrifor… Accipitridae   Aviceda jerdoni                                XYZ         
#4 Animalia Chordata Aves     Ciconiiformes Ciconiidae     Leptoptilos javanicus                          ABC         
#5 Animalia Chordata Aves     Gruiformes    Gruidae        Antigone antigone                              XYZ         
#6 Animalia Chordata Aves     Passeriformes Muscicapidae   Cyanoptila cyanomelana, Cyornis hainanus       ABC, ABC    
#7 Animalia Chordata Aves     Pelecaniform… Threskiornith… Pseudibis davisoni, Thaumatibis gigantea       XYZ, XYZ

Используя этот метод, вы не теряете никакой информации, а также уменьшаете количество строк в фрейме данных. Вы можете добавлять/удалять столбцы из group_by и summarise_at по своему усмотрению.

Спасибо. К сожалению, это не дает более узкой таблицы, которая является целью.

gisol 09.04.2019 05:11

Хотя первоначальный вопрос был о том, чтобы сделать это в R, я понял, что быстрее и проще использовать сводные таблицы в Excel, добавляя каждую более высокую классификацию к строкам, от самого высокого до самого низкого, а затем используя ВПР для добавления необходимых дополнительных данных.

Другие вопросы по теме