切换数据框中的列和行,并在单独的列标题下列出观察结果以执行 Anova:单因素
Posted
技术标签:
【中文标题】切换数据框中的列和行,并在单独的列标题下列出观察结果以执行 Anova:单因素【英文标题】:Switching columns and rows in a data frame, and listing the observations under seperate column headings to perform an Anova: Single Factor 【发布时间】:2019-06-16 07:15:06 【问题描述】:概述
我有一个名为 df1 的数据框,其中包含两列:(1) Urbanisaiton_index(包含**四个子级别 (1-4);和 (2 ) Canopy_Index
对于数据分析,我想进行一次 ANOVA 来区分 Urbanisation_index 的子级别组内部和之间的总体方差,以了解 Canopy_Index 的差异。这个想法是为了区分不同程度的城市化是否会影响树种Quercus petraea的冠层覆盖程度。
为了进行方差分析,我需要翻转数据框中的列并创建一个新的数据框。我希望列标题为 1、2、3、4,以表示 Urbanisation_index 的四个组或/子级别的差异。其次,我想将属于每个子级别的 Canopy_Index 值列出到其特定的子级别列中(请参阅所需的结果)。
一旦构建了所需的新数据框,数据将以正确的格式分组以进行方差分析。
我尝试了许多不同的方法,例如转置,但我无法弄清楚如何将 urbansation_index 子级别 (1-4) 列为列标题并编译它们相关的 Canopy_Index 值(即每个 Urbanisation_index 子级别的 Canopy_Index 的行数) 在其特定列的下方。
例如,如果数据框针对 Urbanisation_index 进行了过滤,子级别 1,Canopy_Index 可能有 6 个观测值(5、5、5、5、55、55),我希望它们列在列下方新数据框中的标题 1,如下所示。
如果有人能提供帮助,我将不胜感激。
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)))
【问题讨论】:
您能否多解释一下您的意思是“并且每个子级别的 Canopy_Index 的聚合行列在列标题下方”您打算如何聚合? Urbanisation_index 和 Canopy_Index 的行总和,如列联表? 数据框包含两列。在 Urbanisation_index 列中,有四个子级别 1-4。我希望列标题为 1、2、3 和 4,以表示 Urbanisation_index 列的子级别。然后我想将每个子级别中包含的所有 Canopy_Index 值放入其关联的子级别列中 您只关心每个子级别的唯一值吗?假设 1 在结果列 1 中有 55、33、55,则唯一的值将是 33、55。 例如,Urbanisation_index 中的子级别 1 包含 Canopy_Index 的 6 个观测值:5、5、5、5、55 和 55。因此,我想在第 1 列中列出这 6 个观测值。每个子级别的观察结果会有所不同,但我会用零或 NA 填补空白。我重新编辑了这篇文章以提供帮助 【参考方案1】:使用您提供的数据:
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
希望对你有帮助
【讨论】:
非常感谢你,菲尔,非常感谢你的帮助以上是关于切换数据框中的列和行,并在单独的列标题下列出观察结果以执行 Anova:单因素的主要内容,如果未能解决你的问题,请参考以下文章