跳转至内容

统计分析:使用 R 入门 / R / 向量

来自维基教科书,开放的书籍,开放的世界
R 中最基础的对象之一是向量,用于存储相同类型(例如数据变量)的多个测量值。向量中可以存储多种数据类型。最常见的是数值向量,其中向量的每个元素只是一个数字。其他常用类型的向量包括字符向量(其中每个元素都是一段文本)和逻辑向量(其中每个元素都是TRUEFALSE[1])。在本主题中,我们将使用“datasets”包提供的几个示例向量,其中包含美国各州的数据(请参阅?state)。R 本身就是一个基于向量的程序;事实上,我们在之前的计算中使用过的数字也被视为只有一个元素的向量。这意味着 R 中的大多数基本函数在被赋予向量作为参数时都会表现得合理,如下所示。
输入
state.area                #a NUMERIC vector giving the area of US states, in square miles
state.name                #a CHARACTER vector (note the quote marks) of state names 
sq.km <- state.area*2.59  #Arithmetic works on numeric vectors, e.g. convert sq miles to sq km
sq.km                     #... the new vector has the calculation applied to each element in turn
sqrt(sq.km)               #Many mathematical functions also apply to each element in turn 
range(state.area)         #But some functions return different length vectors (here, just the max & min).
length(state.area)        #and some, like this useful one, just return a single value.
结果
> state.area # 一个 NUMERIC 向量,给出美国各州的面积,单位为平方英里
[1]  51609 589757 113909  53104 158693 104247   5009   2057  58560  58876   6450  83557  56400

[14] 36291 56290 82264 40395 48523 33215 10577 8257 58216 84068 47716 69686 147138 [27] 77227 110540 9304 7836 121666 49576 52586 70665 41222 69919 96981 45333 1214 [40] 31055 77047 42244 267339 84916 9609 40815 68192 24181 56154 97914 > state.name # 一个 CHARACTER 向量(注意引号),包含各州名称

[1] "Alabama"            "Alaska"             "Arizona"            "Arkansas"          
[5] "California"         "Colorado"           "Connecticut"        "Delaware"          
[9] "Florida"            "Georgia"            "Hawaii"             "Idaho"             

[13] "伊利诺伊州" "印第安纳州" "爱荷华州" "堪萨斯州" [17] "肯塔基州" "路易斯安那州" "缅因州" "马里兰州" [21] "马萨诸塞州" "密歇根州" "明尼苏达州" "密西西比州" [25] "密苏里州" "蒙大拿州" "内布拉斯加州" "内华达州" [29] "新罕布什尔州" "新泽西州" "新墨西哥州" "纽约州" [33] "北卡罗来纳州" "北达科他州" "俄亥俄州" "俄克拉荷马州" [37] "俄勒冈州" "宾夕法尼亚州" "最小的州" "南卡罗来纳州" [41] "南达科他州" "田纳西州" "德克萨斯州" "犹他州" [45] "佛蒙特州" "弗吉尼亚州" "华盛顿州" "西弗吉尼亚州" [49] "威斯康星州" "怀俄明州" > sq.km <- state.area*2.59 # 标准算术运算适用于数值向量,例如将平方英里转换为平方公里 > sq.km # ... 给出另一个向量,其中对每个元素都执行了计算

[1]  133667.31 1527470.63  295024.31  137539.36  411014.87  269999.73   12973.31    5327.63
[9]  151670.40  152488.84   16705.50  216412.63  146076.00   93993.69  145791.10  213063.76

[17] 104623.05 125674.57 86026.85 27394.43 21385.63 150779.44 217736.12 123584.44 [25] 180486.74 381087.42 200017.93 286298.60 24097.36 20295.24 315114.94 128401.84 [33] 136197.74 183022.35 106764.98 181090.21 251180.79 117412.47 3144.26 80432.45 [41] 199551.73 109411.96 692408.01 219932.44 24887.31 105710.85 176617.28 62628.79 [49] 145438.86 253597.26 > sqrt(sq.km) # 许多数学函数也适用于每个元素

[1]  365.60540 1235.90883  543.16140  370.86299  641.10441  519.61498  113.90044   72.99062
[9]  389.44884  390.49819  129.24976  465.20171  382.19890  306.58390  381.82601  461.58830

[17] 323.45487 354.50609 293.30334 165.51263 146.23826 388.30328 466.62203 351.54579 [25] 424.83731 617.32278 447.23364 535.06878 155.23324 142.46136 561.35100 358.33202 [33] 369.04978 427.81111 326.74911 425.54695 501.17940 342.65503 56.07370 283.60615 [41] 446.71213 330.77479 832.11058 468.96955 157.75712 325.13205 420.25859 250.25745 [49] 381.36447 503.58441 > range(state.area) # 但是有些函数会返回不同长度的向量(这里,只有最大值和最小值)。 [1] 1214 589757 > length(state.area) # 有些函数,像这个有用的函数,只返回单个值。 [1] 50

请注意,您的输出的第一部分可能与上面的输出略有不同。根据您屏幕的宽度,每行输出打印的元素数量可能会有所不同。这就是方括号中数字的原因,它们是在向量打印到屏幕时生成的。这些带括号的数字给出了该行上第一个元素的位置,这是一种有用的视觉辅助。例如,查看 state.name 的打印结果,从第二行数过去,我们可以知道第八个州是特拉华州。
您可能偶尔需要从头开始创建自己的向量(尽管大多数向量是从处理已存在文件中的数据得到的)。用于构建向量的最常用函数是c(),之所以这样命名是因为它concatenates(连接)对象在一起。但是,如果您想创建由数字的规则序列组成的向量(例如 2,4,6,8,10,12 或 1,1,2,2,1,1,2,2),您可以使用几个替代函数,包括seq()rep(): 运算符。
输入
c("one", "two", "three", "pi")  #Make a character vector
c(1,2,3,pi)                     #Make a numeric vector
seq(1,3)                        #Create a sequence of numbers
1:3                             #A shortcut for the same thing (but less flexible)
i <- 1:3                        #You can store a vector
i
i <- c(i,pi)                    #To add more elements, you must assign again, e.g. using c() 
i                             
i <- c(i, "text")               #A vector cannot contain different data types, so ... 
i                               #... R converts all elements to the same type
i+1                             #The numbers are now strings of text: arithmetic is impossible 
rep(1, 10)                      #The "rep" function repeats its first argument
rep(3:1,10)                     #The first argument can also be a vector
huge.vector <- 0:(10^7)         #R can easily cope with very big vectors
#huge.vector #VERY BAD IDEA TO UNCOMMENT THIS, unless you want to print out 10 million numbers
rm(huge.vector)                 #"rm" removes objects. Deleting huge unused objects is sensible
结果
> c("one", "two", "three", "pi") # 创建一个字符向量

[1] "one" "two" "three" "pi" > c(1,2,3,pi) # 创建一个数值向量 [1] 1.000000 2.000000 3.000000 3.141593 > seq(1,3) # 创建一个数字序列 [1] 1 2 3 > 1:3 # 同样的操作的简写(但不太灵活) [1] 1 2 3 > i <- 1:3 # 可以存储一个向量 > i [1] 1 2 3 > i <- c(i,pi) # 要添加更多元素,必须再次赋值,例如使用 c() > i [1] 1.000000 2.000000 3.000000 3.141593 > i <- c(i, "text") # 向量不能包含不同数据类型,所以 ... > i # ... R 将所有元素转换为相同类型 [1] "1" "2" "3" "3.14159265358979" "text" > i+1 # 数字现在是文本字符串:算术运算不可能 Error in i + 1 : non-numeric argument to binary operator > rep(1, 10) # "rep" 函数重复其第一个参数

[1] 1 1 1 1 1 1 1 1 1 1

> rep(3:1,10) # 第一个参数也可以是一个向量

[1] 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1

> huge.vector <- 0:(10^7) # R 可以轻松处理非常大的向量 > #huge.vector # 除非您想打印出 1000 万个数字,否则不要取消此注释 > rm(huge.vector) # "rm" 删除对象。删除大型未使用的对象是有意义的


  1. 这些是 R 中的特殊词语,不能用作对象的名称。对象TFTRUEFALSE的临时快捷方式,但如果您使用它们,请注意:因为 T 和 F 只是普通的对象名称,您可以通过覆盖它们来更改它们的含义。
下一页: 逻辑运算 | 上一页: 
主页: 统计分析:使用 R 入门 / R
华夏公益教科书