我是R的新手,很难想出正确解决问题的方法。我习惯于在excel中进行大部分数据分析,所以我认为我被困在电子表格中。现在我进入的数据太大而无法在excel中轻松完成,所以我想深入了解并使用R.提前感谢您的任何帮助。
所以让我们以ChickWeight为例:
> head(ChickWeight)
weight Time Chick Diet
1 42 0 1 1
2 51 2 1 1
3 59 4 1 1
4 64 6 1 1
5 76 8 1 1
6 93 10 1 1
假设我希望能够通过饮食和时间点分割数据框,这样就可以很容易地生成平均权重表,其中列的时间和行的饮食。类似的东西:
0 2 4 6 (time)
1
2 <average weights
3 go in here>
4
(diet)
在我的脑海中,最简单的方法是生成一个包含这些值的二维数组,以便我可以像average_weight[<Time>][<Diet>]
一样访问它们。
我希望通过average_weight[<Time>][]
我已经意识到我没有正确地考虑这个问题,因为我发现的任何工具似乎都没有把我指向正确的方向。我最接近的是使用split()
chicks_by_time_and_diet <- split(ChickWeight, list(ChickWeight$Time, ChickWeight$Diet))
但是这会返回长度为55的列表,而不是二维数组。我也试过调查plyr
。这听起来就像我想要的那样,但我不清楚如何在这方面使用它。
感谢任何帮助,谢谢!
加成: 实际上,我的数据框有比ChickWeight更多的因素,如果可以访问给定“时间”和“饮食”的所有因素,那将是理想的。
E.g。假装ChickWeight有另一个因素height
。是否可以在阵列中的特定位置存储给定饮食的平均值height
和weight
,以便average_weight_and_height[<Time>][<Diet>]
返回(weight, height)
列表?
答案 0 :(得分:4)
使用dplyr/tidyr
library(dplyr)
library(tidyr)
ChickWeight %>%
group_by(Time, Diet) %>%
summarise(weight=mean(weight)) %>%
spread(Time, weight)
答案 1 :(得分:3)
tapply
就是为此而做的:
> with(ChickWeight, tapply(weight, list(Time, Diet), mean))
1 2 3 4
0 41.40000 40.7 40.8 41.0000
2 47.25000 49.4 50.4 51.8000
4 56.47368 59.8 62.2 64.5000
6 66.78947 75.4 77.9 83.9000
8 79.68421 91.7 98.4 105.6000
10 93.05263 108.5 117.1 126.0000
12 108.52632 131.3 144.4 151.4000
14 123.38889 141.9 164.5 161.8000
16 144.64706 164.7 197.4 182.0000
18 158.94118 187.7 233.1 202.9000
20 170.41176 205.6 258.9 233.8889
21 177.75000 214.7 270.3 238.5556
您也可以使用data.table
或dplyr
,但您需要重新设置结果以获得2D(或3D)格式:
library(data.table)
DT <- data.table(ChickWeight)[, mean(weight), by=.(Time, Diet)]
dcast.data.table(DT, Time ~ Diet)
或者,正如Arun指出的那样(这里我们只使用普通数据框):
reshape2::dcast(ChickWeight, Time ~ Diet, value.var="weight", fun.aggregate=mean)
许多R分析涉及以“长格式”(在我们DT
之前见dcast
)来熟悉数据,其中维度由列表示。