将R的“输出”转换为“命令到数据帧 [英] converting output of R's "by" command to data frame

查看:115
本文介绍了将R的“输出”转换为“命令到数据帧的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图通过命令使用R的来获取数据帧子集的列。例如,考虑这个数据框架:

 > z = data.frame(labels = c(a,a,b,c,c),data = matrix(1:20,nrow = 5))
> z
标签数据1 data.2 data.3 data.4
1 a 1 6 11 16
2 a 2 7 12 17
3 b 3 8 13 18
4 c 4 9 14 19
5 c 5 10 15 20

我可以使用R的通过命令获取列表示根据标签列:

 > by(z [,2:5],z $ labels,colMeans)
z [,1]:a
data.1 data.2 data.3 data.4
1.5 6.5 11.5 16.5
---------------------------------------------- --------------
z [,1]:b
data.1 data.2 data.3 data.4
3 8 13 18
------------------------------------------------ ------------
z [,1]:c
data.1 data.2 data.3 data.4
4.5 9.5 14.5 19.5

但是如何强制输出回到数据帧? as.data.frame 不工作...

 > ; as.data.frame(by(z [,2:5],z $ labels,colMeans))
as.data.frame.default中的错误(by(z [,2:5],z $ labels ,colmeans)):
不能强制类'by'into a data.frame


解决方案

您可以使用 ddply plyr

  library(plyr)
ddply(z,。(labels),numcolwise(mean))
labels data.1 data。 2 data.3 data.4
1 a 1.5 6.5 11.5 16.5
2 b 3.0 8.0 13.0 18.0
3 c 4.5 9.5 14.5 19.5
pre>

聚合 stats

  aggregate(z [, -  1],by = list(z $ labels),mean)
Group.1 data.1 data.2 data.3 data.4
1 a 1.5 6.5 11.5 16.5
2 b 3.0 8.0 13.0 18.0
3 c 4.5 9.5 14.5 19.5

dcast reshape2 / p>

  l ibrary(reshape2)
dcast(melt(z),labels〜variable,mean)

使用 sapply

  t(sapply(split(z [, - 1],z $ labels),colMeans))
data.1 data.2 data.3 data.4
a 1.5 6.5 11.5 16.5
b 3.0 8.0 13.0 18.0
c 4.5 9.5 14.5 19.5


I'm trying to use R's by command to get column means for subsets of a data frame. For example, consider this data frame:

> z = data.frame(labels=c("a","a","b","c","c"),data=matrix(1:20,nrow=5))
> z
  labels data.1 data.2 data.3 data.4
1      a      1      6     11     16
2      a      2      7     12     17
3      b      3      8     13     18
4      c      4      9     14     19
5      c      5     10     15     20

I can use R's by command to get the column means according to the labels column:

> by(z[,2:5],z$labels,colMeans)
z[, 1]: a
data.1 data.2 data.3 data.4
   1.5    6.5   11.5   16.5
------------------------------------------------------------
z[, 1]: b
data.1 data.2 data.3 data.4
     3      8     13     18
------------------------------------------------------------
z[, 1]: c
data.1 data.2 data.3 data.4
   4.5    9.5   14.5   19.5

But how do I coerce the output back to a data frame? as.data.frame doesn't work...

> as.data.frame(by(z[,2:5],z$labels,colMeans))
Error in as.data.frame.default(by(z[, 2:5], z$labels, colMeans)) :
  cannot coerce class '"by"' into a data.frame

解决方案

You can use ddply from plyr package

library(plyr)
ddply(z, .(labels), numcolwise(mean))
  labels data.1 data.2 data.3 data.4
1      a    1.5    6.5   11.5   16.5
2      b    3.0    8.0   13.0   18.0
3      c    4.5    9.5   14.5   19.5

Or aggregate from stats

aggregate(z[,-1], by=list(z$labels), mean)
  Group.1 data.1 data.2 data.3 data.4
1       a    1.5    6.5   11.5   16.5
2       b    3.0    8.0   13.0   18.0
3       c    4.5    9.5   14.5   19.5

Or dcast from reshape2 package

library(reshape2)
dcast( melt(z), labels ~ variable, mean)

Using sapply :

 t(sapply(split(z[,-1], z$labels), colMeans))
  data.1 data.2 data.3 data.4
a    1.5    6.5   11.5   16.5
b    3.0    8.0   13.0   18.0
c    4.5    9.5   14.5   19.5

这篇关于将R的“输出”转换为“命令到数据帧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆