R数据分类汇总 / Data Classification in R

        许多数据的分类、汇总等基本处理方法,都可以再R中实现。实际上,这些最基本的数据处理,对R初学者来说却是很陌生,初学者能很快熟悉许多数据包(package)的“黑箱”,却不熟悉一些基本的数据处理方法。因此初学者只能将数据暂时保存到Excel表格中,再分类、汇总、计算,最后再一次导入R中。如果慢慢了解如何在R中直接处理这些数据,则会免除不少这样费时费力的操作。这里就介绍在R中对数据分类汇总的一种方法。

        这里有一组由25个个体(行)、10个变量(列)组成的示例数据,25个个体共分为5组,即a_01~a_05为组a,以此类推。这样的数据既可以是从外部读取到R中的,也可以是R在某项运算中得出的一组数据,将这样的数据构成一个data frame,即可在R中直接进行分类汇总。示例数据如下:


testdata1

计算过程如下:

# 首先将示例数据制成.txt文件或.csv文件,用read.table()或read.csv()读取。这里需要定义行名称即row.names=1


test1 <- read.table("~/Desktop/blog/testdata1.txt", head=TRUE, row.names=1)
head(test1)
             PC1        PC2       PC3        PC4       PC5        PC6        PC7        PC8        PC9       PC10
a_01 -118.276742 -23.926614 21.773257  -3.040001 4.4819716  6.5624516 -1.4216630  2.1803930  -5.3561303  3.6481240
a_02 -127.504188  -2.438878 30.199530 -16.105147 4.1204710  4.5415493  3.9245204  5.7852279  0.3257700  4.0240099
a_03  -30.410616  -4.635041 -9.640130 -15.289154 1.6685477  3.9564392 -8.4811428  0.9852086 -0.5275808  3.2297635
a_04  -40.184651  -4.360771 27.153106  -9.330509 0.8764297 -0.9593605 -4.6557417 -0.3695602 -1.8116350  4.0583695
a_05  -89.772086  12.528634 21.670484  -5.994110 0.3868215  1.3732054  3.2305223 -1.3562328 -1.9170360 -0.7763057
b_01    8.902091  -8.892623  5.017751   3.968509 0.8045994  2.2819306 -0.9436336  3.9358852 -0.4967033 -2.9346021

# 要分类汇总,必须要有汇总的条件。该示例数据只有一个个体名称,并没有提供汇总的条件。如果按照上述的5个一组,则需要定义一个汇总条件,并将这个汇总条件与示例数据组成一个data frame。

label <- factor(rep(c("a", "b", "c", "d", "e"), times = c(5, 5, 5, 5, 5)))
data1 <- data.frame(test1, label) # 将label数据加入data frame
head(data1)
             PC1        PC2       PC3        PC4       PC5        PC6        PC7        PC8        PC9       PC10 label
a_01 -118.276742 -23.926614 21.773257  -3.040001 4.4819716  6.5624516 -1.4216630  2.1803930 -5.3561303  3.6481240     a
a_02 -127.504188  -2.438878 30.199530 -16.105147 4.1204710  4.5415493  3.9245204  5.7852279  0.3257700  4.0240099     a
a_03  -30.410616  -4.635041 -9.640130 -15.289154 1.6685477  3.9564392 -8.4811428  0.9852086 -0.5275808  3.2297635     a
a_04  -40.184651  -4.360771 27.153106  -9.330509 0.8764297 -0.9593605 -4.6557417 -0.3695602 -1.8116350  4.0583695     a
a_05  -89.772086  12.528634 21.670484  -5.994110 0.3868215  1.3732054  3.2305223 -1.3562328 -1.9170360 -0.7763057     a
b_01    8.902091  -8.892623  5.017751   3.968509 0.8045994  2.2819306 -0.9436336  3.9358852 -0.4967033 -2.9346021     b

# 用aggregate()函数对数据分类汇总,这里使用mean汇总平均值。详细其他方法请参见??aggregate()。对data1的前1~10列分类汇总,因此定义data[1:10]。

mean.data1 <- aggregate(data1[1:10], list(data1$label), FUN=mean)
head(mean.data1)
  Group.1         PC1        PC2        PC3         PC4        PC5        PC6        PC7       PC8        PC9       PC10
1       a  -81.229657  -4.566534  18.231250  -9.9517843  2.3068483  3.0948570 -1.4807010  1.445007 -1.8573224  2.8367922
2       b   81.222670 -19.276394  -1.962273   0.4676029  1.5574290 -0.1894389  0.7334870  1.170848 -0.4449162  0.1938018
3       c   -3.699758 -22.770807 -10.053442 -13.6703142  2.7619286 -0.3795122 -3.0773497  2.703907  0.9515855 -1.7949338
4       d  -29.111016  24.887975  -6.812806  -0.9661498  0.7422711 -4.5822906 -0.6061111  5.001436 -0.6084882  1.1292232
5       e -126.650280  -7.704062   4.801900  -2.6653565 -5.7818991  5.9024574 -5.0323947 -2.365573  1.2418414  1.1509067

# 得到了各数据的平均值。然而,所得数据中第一列是分类数据Group.1,在后续计算时应当将这一分类数据作为行名称,否则会干扰真正数据值的计算。
# 去掉第一列数据

head(mean.data1[,-1])
          PC1        PC2        PC3         PC4        PC5        PC6        PC7       PC8        PC9       PC10
1  -81.229657  -4.566534  18.231250  -9.9517843  2.3068483  3.0948570 -1.4807010  1.445007 -1.8573224  2.8367922
2   81.222670 -19.276394  -1.962273   0.4676029  1.5574290 -0.1894389  0.7334870  1.170848 -0.4449162  0.1938018
3   -3.699758 -22.770807 -10.053442 -13.6703142  2.7619286 -0.3795122 -3.0773497  2.703907  0.9515855 -1.7949338
4  -29.111016  24.887975  -6.812806  -0.9661498  0.7422711 -4.5822906 -0.6061111  5.001436 -0.6084882  1.1292232
5 -126.650280  -7.704062   4.801900  -2.6653565 -5.7818991  5.9024574 -5.0323947 -2.365573  1.2418414  1.1509067

mean.data1 <- data.frame(mean.data1[,-1], row.names = mean.data1[,1])
head(mean.data1)
          PC1        PC2        PC3         PC4        PC5        PC6        PC7       PC8        PC9       PC10
a  -81.229657  -4.566534  18.231250  -9.9517843  2.3068483  3.0948570 -1.4807010  1.445007 -1.8573224  2.8367922
b   81.222670 -19.276394  -1.962273   0.4676029  1.5574290 -0.1894389  0.7334870  1.170848 -0.4449162  0.1938018
c   -3.699758 -22.770807 -10.053442 -13.6703142  2.7619286 -0.3795122 -3.0773497  2.703907  0.9515855 -1.7949338
d  -29.111016  24.887975  -6.812806  -0.9661498  0.7422711 -4.5822906 -0.6061111  5.001436 -0.6084882  1.1292232
e -126.650280  -7.704062   4.801900  -2.6653565 -5.7818991  5.9024574 -5.0323947 -2.365573  1.2418414  1.1509067
# 这时,分类数据a~e成为数据的行名称

# 如果分类汇总之后的数据,行排列顺序不是你预期的,那么则可重新排列行

mean.data1.new <- mean.data1[c(5,4,3,2,1),]
head(mean.data1.new)
          PC1        PC2        PC3         PC4        PC5        PC6        PC7       PC8        PC9       PC10
e -126.650280  -7.704062   4.801900  -2.6653565 -5.7818991  5.9024574 -5.0323947 -2.365573  1.2418414  1.1509067
d  -29.111016  24.887975  -6.812806  -0.9661498  0.7422711 -4.5822906 -0.6061111  5.001436 -0.6084882  1.1292232
c   -3.699758 -22.770807 -10.053442 -13.6703142  2.7619286 -0.3795122 -3.0773497  2.703907  0.9515855 -1.7949338
b   81.222670 -19.276394  -1.962273   0.4676029  1.5574290 -0.1894389  0.7334870  1.170848 -0.4449162  0.1938018
a  -81.229657  -4.566534  18.231250  -9.9517843  2.3068483  3.0948570 -1.4807010  1.445007 -1.8573224  2.8367922

       有人会说,这岂不是比在Excel中的操作更麻烦吗?事实是,这里只有25个个体、5组数据,在Excel中操作确实比较简单。如果你有250个数据、50个组甚至更多,那么在Excel中需要编写每个组的名称,需要数据分类计算平均值,然后再导出平均值,复制粘贴处理之后,得到想要的结果之后,还要再一次导入R中。
        因此,在数据量非常大的情况下,用R进行分类汇总更好,且得到的数据框架能非常方便地继续进行R的其他计算。





评论

此博客中的热门博文

带误差条的线图 / Line plot with error bar in R