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中直接进行分类汇总。示例数据如下:
计算过程如下:
# 首先将示例数据制成.txt文件或.csv文件,用read.table()或read.csv()读取。这里需要定义行名称即row.names=1
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
# 如果分类汇总之后的数据,行排列顺序不是你预期的,那么则可重新排列行
这里有一组由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的其他计算。
评论
发表评论