R 我需要帮助思考如何拆分数据帧以执行操作

R 我需要帮助思考如何拆分数据帧以执行操作,r,dataframe,aggregate,reshape,dplyr,R,Dataframe,Aggregate,Reshape,Dplyr,我是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

我是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
假设我希望能够通过diet和time point来拆分数据帧,这样就可以很容易地生成一个平均权重表,其中包含列的时间和行的diet。比如:

  0   2   4   6 (time)
1   
2    <average weights
3         go in here>
4
(diet)
但这将返回长度为55的列表,而不是二维数组。我还试着研究了
plyr
。这听起来似乎正是我想要的,但我不清楚如何使用它来达到这个目的

非常感谢您的帮助,谢谢

奖金: 事实上,我的数据框架比鸡体重有更多的因素,如果有可能访问给定“时间”和“饮食”的所有因素,那将是理想的


例如,假设体重还有另一个因素,
身高
。是否可以将给定饮食的平均
身高
体重
存储在数组中的特定位置,以便
平均体重和身高[]
返回
(体重、身高)
的列表?

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)格式:


很多R分析都涉及到熟悉“长格式”的数据(参见
DT
在我们
dcast
it之前),其中维度由列表示。

使用
dplyr/tidyr

library(dplyr)
library(tidyr)
ChickWeight %>% 
       group_by(Time, Diet) %>% 
       summarise(weight=mean(weight)) %>%
       spread(Time, weight)

哇,这正是我需要的工具。非常感谢你!我很惊讶我在寻找方法时从未遇到过这种情况。@Arun,我意识到。我在原始语句b/c中留下了用于标准拆分/分组的seing data.table,对于新手来说可能很有用。然后我在下一个示例中使用了
dcast
,因为不需要将ChickWeight转换为
data.table
,所以我注意到很多R的语法都相当迟钝。在google中键入%>%无效也无济于事。你有什么建议可以帮助你克服这个学习曲线吗?我只需要花上几个小时阅读一页又一页吗?@DanBurkhardt虽然阅读是必要的,但更多的是练习,尝试解决stackoverflow/R邮件列表中发布的问题。这很有帮助。我建议阅读有关整洁数据的内容,这将帮助您了解如何在R中最自然地存储数据。感谢本文,@hadley。仅供参考,该链接应指向
http://www.jstatsoft.org/v59/i10/paper
。出于某种原因,如果前面没有
www.
,它似乎就无法工作。编辑:nvm,这似乎是stackoverflow部分的自动格式化问题
library(data.table)
DT <- data.table(ChickWeight)[, mean(weight), by=.(Time, Diet)]
dcast.data.table(DT, Time ~ Diet)
reshape2::dcast(ChickWeight, Time ~ Diet, value.var="weight", fun.aggregate=mean)
library(dplyr)
library(tidyr)
ChickWeight %>% 
       group_by(Time, Diet) %>% 
       summarise(weight=mean(weight)) %>%
       spread(Time, weight)