Переключение столбцов и строк во фрейме данных и перечисление наблюдений под отдельными заголовками столбцов для выполнения Anova: однофакторный - PullRequest
0 голосов
/ 22 января 2019

Обзор

У меня есть фрейм данных с именем df1 , содержащий два столбца: (1) Urbanisaiton_index (содержит ** четыре подуровня (1-4)) ; и ( 2) Canopy_Index

Для анализа данных я хочу провести одну ANOVA, чтобы различать общую дисперсию внутри и между группами подуровней для Urbanisation_index для различий вCanopy_Index. Идея состоит в том, чтобы определить, влияют ли различные уровни урбанизации на степень покрытия навесом у древесных пород Quercus petraea.

Чтобы провести ANOVA, мне нужно перевернуть столбцыво фрейме данных и создайте новый фрейм данных. Мне бы хотелось, чтобы заголовки столбцов были 1, 2, 3, 4, чтобы представить различия в четырех группах или / подуровнях Urbanisation_index. Во-вторых, я хотел бы перечислить Canopy_Indexзначения, относящиеся к каждому подуровню, в свой столбец определенного подуровня (см. требуемые результаты).

После того, как требуемый новый фрейм данных будетВ построенном виде данные будут сгруппированы в правильном формате для проведения ANOVA.

Я пробовал много разных способов, таких как транспонирование, но я не могу понять, как перечислить подуровни urbansation_index (1-4) в качестве заголовков столбцов и скомпилировать соответствующие им значения Canopy_Index (то есть количество строк в Canopy_Index).в соответствии с подуровнем Urbanisation_index) в соответствующих столбцах.

Например, если кадр данных был отфильтрован для Urbanisation_index, подуровень 1, может быть 6 наблюдений (5, 5, 5, 5, 55, 55) для Canopy_Index, и я бы хотел, чтобы они былиперечислены под заголовком столбца 1 в новом фрейме данных, как показано ниже.

enter image description here

Если кто-то может помочь, я был бы очень признателен.

Rcode

##transpose
  t(df1)

Желаемый результат

 1   2   3   4
65  55   5  35
45  85  55  45
75  75  15  25

Данные

    structure(list(Urbanisation_index = c(2, 2, 4, 4, 3, 3, 4, 4, 
4, 2, 4, 3, 4, 4, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 
2, 2, 2, 4, 4, 3, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 4, 4, 4, 
4, 4, 4, 4), Canopy_Index = c(65, 75, 55, 85, 85, 85, 95, 85, 
85, 45, 65, 75, 75, 65, 35, 75, 65, 85, 65, 95, 75, 75, 75, 65, 
75, 65, 75, 95, 95, 85, 85, 85, 75, 75, 65, 85, 75, 65, 55, 95, 
95, 95, 95, 45, 55, 35, 55, 65, 95, 95, 45, 65, 45, 55)), row.names = c(NA, 
-54L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x1030086e0>, index = structure(integer(0), "`__Species`" = integer(0)))

1 Ответ

0 голосов
/ 22 января 2019

Используя предоставленные вами данные:

data<-structure(list(Urbanisation_index = c(2, 2, 4, 4, 3, 3, 4, 4, 
                                            4, 2, 4, 3, 4, 4, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 
                                            2, 2, 2, 4, 4, 3, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 4, 4, 4, 
                                            4, 4, 4, 4), 
                     Canopy_Index = c(65, 75, 55, 85, 85, 85, 95, 85, 
                                      85, 45, 65, 75, 75, 65, 35, 75, 65, 85, 65, 95, 75, 75, 75, 65, 
                                      75, 65, 75, 95, 95, 85, 85, 85, 75, 75, 65, 85, 75, 65, 55, 95, 
                                      95, 95, 95, 45, 55, 35, 55, 65, 95, 95, 45, 65, 45, 55)), 
                row.names = c(NA, 
                              -54L), 
                class = c("data.table", "data.frame"), 
                index = structure(integer(0), "`__Species`" = integer(0)))

Загрузка пакетов

library(tidyr)
library(dplyr)
library(purrr)

Сначала сгруппируйте значения индексов купола по индексу урбанизации и получите список всех долин и добавьте их с поправкой на длину.

a<-data %>%
  group_by(Urbanisation_index) %>%
  summarise(Canopy_Indexes=paste(Canopy_Index, collapse = "-")) %>%
  spread(key = Urbanisation_index, value = Canopy_Indexes) %>%
  map(.f = ~ separate_rows(data.frame(.), 1, sep = "-"))

a <- lapply(a, function(x){
  x1<-x[,1]
  length(x1) <- max(sapply(a, nrow))
  x1
}) %>% data.frame()

colnames(a) <- paste("sub_level", 1:4, sep = "_")
a

Вот еще одно решение, более компактное, но, поскольку я вышел с предыдущим первым, я не хотел тратить его впустую:)

b <- map(split(data, data$Urbanisation_index), 2)


b <- lapply(b, function(x){
  x1<-x
  length(x1) <- max(sapply(b, length))
  x1
}) %>% data.frame()

colnames(b) <- paste("sub_level", 1:4, sep = "_")
b

Результат:

   sub_level_1 sub_level_2 sub_level_3 sub_level_4
1           35          65          85          55
2           75          75          85          85
3           65          45          75          95
4           85          95          65          85
5           55          85          95          85
6           55          85          75          65
7           NA          85          75          75
8           NA          85          75          65
9           NA          75          65          75
10          NA          65          75          75
11          NA          95          65          65
12          NA          95          75          95
13          NA          95          95          95
14          NA          95          65          45
15          NA          45          NA          65
16          NA          55          NA          45
17          NA          35          NA          55

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...