Как мне свернуть строки данных о наличии / отсутствии в R?

#r #dataframe

#r #фрейм данных

Вопрос:

Ниже приведена упрощенная версия моего фрейма данных. Он содержит данные о наличии (обозначается цифрой «1») и отсутствии (обозначается цифрой «0») различных признаков у различных видов растений.

 Family <- c("Asteraceae", "Asteraceae", "Asteraceae", "Asteraceae", "Asteraceae", "Asteraceae", "Myrtaceae", "Myrtaceae", "Myrtaceae")
Species <- c("Senecio lautus", "Lactuca sativa", "Cynara cardunculus", "Helianthus annuus", "Helianthus tuberosus", "Smallanthus sonchifolius", "Eucalyptus pauciflora", "Eucalyptus regnans", "Corymbia maculata")
Trait1 <- c(1,1,0,1,0,1,0,0,0)
Trait2 <- c(0,0,1,1,1,0,0,1,1)
Trait3 <- c(0,0,1,1,0,1,0,0,0)
dataframe1 <- data.frame(Family, Species, Trait1, Trait2, Trait3)

dataframe1
      Family                  Species Trait1 Trait2 Trait3
1 Asteraceae           Senecio lautus      1      0      0
2 Asteraceae           Lactuca sativa      1      0      0
3 Asteraceae       Cynara cardunculus      0      1      1
4 Asteraceae        Helianthus annuus      1      1      1
5 Asteraceae     Helianthus tuberosus      0      1      0
6 Asteraceae Smallanthus sonchifolius      1      0      1
7  Myrtaceae    Eucalyptus pauciflora      0      0      0
8  Myrtaceae       Eucalyptus regnans      0      1      0
9  Myrtaceae        Corymbia maculata      0      1      0
 

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

       Family        Number of Species  Trait1  Trait2  Trait3
1 Asteraceae                        6       1       1       1
2  Myrtaceae                        3       0       1       0    
 

Комментарии:

1. Как у вас Trait1 значение 1 для «Asteraceae»? Он присутствует в 4 Species .

2. @RonakShah Во втором фрейме данных значение if 1 для признака 1 в Asteraceae указывает на наличие признака 1 у любого вида Asteraceae, а не на количество видов с признаком 1 (т.Е. 4).

Ответ №1:

После группировки по «семейству» получите количество наблюдений ( n() как «Number_of_species»), выполните цикл across «Признак», проверка столбцов на наличие any ИСТИННЫХ значений (после преобразования в logical ) или используйте (1 %in% .) или (. > 0)

 library(dplyr)
dataframe1 %>% 
   group_by(Family) %>%
   summarise(Number_of_species = n(),
      across(starts_with('Trait'), ~  (any(as.logical(.)))), .groups = 'drop')
 

-вывод

 # A tibble: 2 x 5
#  Family     Number_of_species Trait1 Trait2 Trait3
#  <chr>                  <int>  <int>  <int>  <int>
#1 Asteraceae                 6      1      1      1
#2 Myrtaceae                  3      0      1      0
 

Ответ №2:

Опция data.table

 setDT(dataframe1)[, c(.(Species = .N),  (colSums(.SD) > 0)), Family, .SDcols = patterns("^Trait")]
 

дает

        Family Species Trait1 Trait2 Trait3
1: Asteraceae       6      1      1      1
2:  Myrtaceae       3      0      1      0