#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»? Он присутствует в 4Species
.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