2 min read

Steem 和 R 语言:跟大鹏学 R 语言(10)行和列

Links: steemit.com, cnsteem.com, busy.org, steemdb.com, steemd.com

前情回顾:

本文选自《学 R:零基础学习 R 语言》(研究出版社,大鹏、李怡著,2018)第二章,有改动。

列名称都有哪些呢?其实在输入$符号后,RStudio就立刻贴心地把所有列名称列出来了,供我们选择。如果没有出现,请咨询tab小助理。除此之外,用names()函数或colnames()函数可以查看列名称:

names(mydata2) # 或 colnames(mydata2)
##  [1] "X"   "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug"
## [10] "Sep" "Oct" "Nov" "Dec"

第一列在原始文件中没有名字,所以R自动起了个名字叫做“X”。我们可以把它的列名称改为“year”:

names(mydata2)[1] <- 'year'
names(mydata2)
##  [1] "year" "Jan"  "Feb"  "Mar"  "Apr"  "May"  "Jun"  "Jul" 
##  [9] "Aug"  "Sep"  "Oct"  "Nov"  "Dec"

类似的,用rownames()函数可以查看行名称。由于我们并没有给各行起名字,R默认按数字顺序命名。我们可以将年份列作为行名称:

rownames(mydata2)
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11"
## [12] "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22"
## [23] "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33"
## [34] "34" "35" "36" "37" "38" "39"
rownames(mydata2) <- mydata2$year
rownames(mydata2)
##  [1] "1959" "1960" "1961" "1962" "1963" "1964" "1965" "1966"
##  [9] "1967" "1968" "1969" "1970" "1971" "1972" "1973" "1974"
## [17] "1975" "1976" "1977" "1978" "1979" "1980" "1981" "1982"
## [25] "1983" "1984" "1985" "1986" "1987" "1988" "1989" "1990"
## [33] "1991" "1992" "1993" "1994" "1995" "1996" "1997"

这样,如果要查看1995年9月的数据,就不用再数第几行第几列了,用行名称和列名称更方便:

mydata2['1995', 'Sep']
## [1] 358.11

这对于处理大型的表格尤其方便,省得瞪着眼睛去数数寻找单元格了,很大程度上减少了对视力的伤害。

任何一行或一列,都可以作为向量来计算。我们仿照上一章介绍的向量计算方法,来算一下1995年全年二氧化碳的平均浓度,只要对该行的第2到13列求平均:

sum(mydata2['1995', 2:13]) / 12
## [1] 360.9142

思考 2.3 直接使用平均值函数mean()行不行?为什么?

如果求1996年比1995年二氧化碳浓度增加了多少,可以料想,只需把两行的平均值相减:

sum(mydata2['1996', 2:13]) / 12 - 
  sum(mydata2['1995', 2:13]) / 12
## [1] 1.7725

那么,1996年每个月比1995年同比增加了多少二氧化碳?

mydata2['1996', ] - mydata2['1995', ]
##      year  Jan  Feb Mar  Apr  May  Jun  Jul  Aug Sep  Oct
## 1996    1 2.11 2.26 2.4 1.28 1.63 1.71 1.76 2.04 1.4 1.85
##       Nov  Dec
## 1996 1.19 1.64

这里我们可以体会向量计算的特点,是逐个对应相减的。

现在,你可以试着对任意一行或一列来做向量计算了。

练习 2.1 请计算1995年二氧化碳浓度的最大值和最小值。

整行或整列的计算,在R中有更方便的方法,可以这样:

colMeans(mydata2[, 2:13]) # 排除掉第一列后,对整列求平均
##      Jan      Feb      Mar      Apr      May      Jun 
## 336.4308 337.2033 338.0546 339.2944 339.8821 339.3282 
##      Jul      Aug      Sep      Oct      Nov      Dec 
## 337.9164 335.9579 334.2428 334.1692 335.4679 336.6946

每年和每月的平均值一下就算出来了。类似的函数还有整行求和rowSum()和整列求和colSum()。函数名很好记,就是在原来函数前面加个rowcol,并且注意大小写。