欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

R语言实战(第2版)笔记-第2章 创建数据集

程序员文章站 2024-02-28 11:49:46
...

第2章 创建数据集

2.1 数据集的概念

R可以处理的数据类型(模式)包括数值型、字符型、逻辑型( TRUE/FALSE)、复数型(虚数)和原生型(字节)。

2.2 数据结构

  1. 对象(object)是指可以赋值给变量的任何事物,包括常量、数据结构、函数,甚至图形。对象都拥有某种模式,描述了此对象是如何存储的,以及某个类,像print这样的泛型函数表明如何处理此对象。
  2. 数据框(data frame)是R中用于存储数据的一种结构:列表示变量,行表示观测。在同一个数据框中可以存储不同类型(如数值型、字符型)的变量。数据框将是你用来存储数据集的主要数据结构。
  3. 因子(factor)是名义型变量或有序型变量。它们在R中被特殊地存储和处理。

2.2.1 向量

  1. 向量是用于存储数值型、字符型或逻辑型数据的一维数组。
  2. 执行组合功能的函数c()可用来创建向量。
a <- c(1, 2, 5, 3, 6, -2, 4) 
b <- c("one", "two", "three") 
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)

#标量是只含一个元素的向量
f <- 3
g <- "US"
h <- TRUE

#同一向量中无法混杂不同模式的数据

2.2.2 矩阵

矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix()创建矩阵。

myymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, byrow=logical_value, dimnames=list( char_vector_rownames,char_vector_colnames))

#其中vector包含了矩阵的元素, nrowncol用以指定行和列的维数, dimnames包含了可选的、以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充( byrow=FALSE),默认情况下按列填充。

我们可以使用下标和方括号来选择矩阵中的行、列或元素。 X[i,]指矩阵 X中的第i行,X[,j]指第j列,X[i, j]指第i行第j个元素。选择多行或多列时,下标 i和j可为数值型向量

2.2.3 数组

数组(array)与矩阵类似,但是维度可以大于2。
数组可通过array函数创建

myarray <- array(vector, dimensions, dimnames) 

#其中vector包含了数组中的数据, dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames是可选的、各维度名称标签的列表。

2.2.4 数据框

  1. 由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更为一般。
  2. data.frame()
mydata <- data.frame(col1, col2, col3,...) 

#其中的列向量 col1、col2、col3等可为任何类型(如字符型、数值型或逻辑型)。每一列的名称可由函数names指定。

选取数据框中元素的方式有若干种。你可以使用前述(如矩阵中的)下标记号,亦可直接指定列名。

> patientdata[1:2] 
  patientID age 
1    1      25  
2    2      34  
3    3      28 
4    4      52


> patientdata[c("diabetes", "status")]
  diabetes status 
1  Type1    Poor 
2  Type2  Improved 
3  Type1  Excellent 
4  Type1    Poor 

> patientdata$age
[1] 25 34 28 52

(1) attach()、detach()

attach(mtcars) 
summary(mpg) 
plot(mpg, disp) plot(mpg, wt)
detach(mtcars)

#函数attach()可将数据框添加到R的搜索路径中。
#函数detach()将数据框从搜索路径中移除。
#detach()并不会对数据框本身做任何处理。

当名称相同的对象不止一个时,这种方法的局限性就很明显了。

> mpg <- c(25, 36, 47) 
> attach(mtcars) 
The following object(s) are masked _by_'.GlobalEnv': 
mpg 
> plot(mpg, wt) 
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' and 'y' lengths differ 
> mpg [1] 25 36 47

#这里,在数据框mtcars被绑定(attach)之前,你们的环境中已经有了一个名为mpg的对象。在这种情况下,原始对象将取得优先权,这与你们想要的结果有所出入。由于mpg中有3个元素而disp中有32个元素,故plot语句出错。

(2) with()

with(mtcars, {
   print(summary(mpg)) 
   plot(mpg, disp) 
   plot(mpg, wt)
})

#在这种情况下,花括号 {}之间的语句都针对数据框 mtcars执行,这样就无需担心名称冲突了。如果仅有一条语句(例如summary(mpg)),那么花括号 {}可以省略。
函数with()的局限性在于,赋值仅在此函数的括号内生效。如果你需要创建在 with()结构以外存在的对象,使用特殊赋值符(<<-)替代标准赋值符(<-)即可,它可将对象保存到 with()之外的全局环境中。

(3) 实例标识符

在病例数据中,病人编号(patientID)用于区分数据集中不同的个体。在R中,实例标识符(case identifier)可通过数据框操作函数中的rowname选项指定。

patientdata <- data.frame(patientID, age, diabetes, status, row.names=patientID) 

2.2.5 因子

  1. 变量可归结为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别
  2. 类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)
  3. 函数factor()以一个整数向量的形式存储类别值,整数的取值范围是 [1…k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
  4. 要表示有序型变量,需要为函数 factor()指定参数ordered=TRUE。
diabetes <- c("Type1", "Type2", "Type1", "Type1") 

#语句diabetes <- factor(diabetes)将此向量存储为 (1, 2, 1, 1),并在内部将其关联为 1=Type1和2=Type2(具体赋值根据字母顺序而定)。
status <- c("Poor", "Improved", "Excellent", "Poor") 
status <- factor(status, ordered=TRUE)

#会将向量编码为 (3, 2, 1, 3),并在内部将这些值关联为 1=Excellent、2=Improved以及3=Poor。
#对于字符型向量,因子的水平默认依字母顺序创建。通过指定levels选项来覆盖默认排序。

status <- factor(status, order=TRUE, levels=c("Poor", "Improved", "Excellent")) 

#数值型变量可以用 levels和labels参数来编码成因子。如果男性被编码成1,女性被编码成2,则以下语句: 
sex <- factor(sex, levels=c(1, 2), labels=c("Male", "Female")) 

2.2.6 列表

列表就是一些对象(或成分, component)的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。

某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。

mylist <- list(object1, object2, ...)
mylist <- list(name1=object1, name2=object2, ...)

#可以通过在双重方括号中指明代表某个成分的数字或名称来访问列表中的元素。

2.3 数据的输入

2.3.1 使用键盘输入数据

R中的函数edit()会自动调用一个允许手动输入数据的文本编辑器

(1) 创建一个空数据框(或矩阵),其中变量名和变量的模式需与理想中的最终数据集一致;
(2) 针对这个数据对象调用文本编辑器,输入你的数据,并将结果保存回此数据对象中。

mydata <- data.frame(age=numeric(0), gender=character(0), weight=numeric(0)) 
mydata <- edit(mydata) 

#类似于age=numeric(0)的赋值语句将创建一个指定模式但不含实际数据的变量。
#注意,编辑的结果需要赋值回对象本身。函数edit()事实上是在对象的一个副本上进行操作的。如果你不将其赋值到一个目标,你的所有修改将会全部丢失!


mydata <- edit(mydata)的一种简捷的等价写法是fix(mydata)

此外,你可以直接在你的程序中嵌入数据集

> mydatatxt<-"
+ age gender weight 
+ 25 m 166 
+ 30 f 115 
+ 18 f 120"
> mydata <- read.table(header=TRUE, text=mydatatxt)
> mydata
  age gender weight
1  25      m    166
2  30      f    115
3  18      f    120

#在Rstudio中似乎不行,在R中可行