第二章 创建数据集

news2024/12/27 10:15:10

2.1 数据集的概念

数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。表2-1提供了一个假想的病例数据集。
在这里插入图片描述
不同的行业对于数据集的行和列叫法不同。统计学家称它们为观(observation)和变量(variable),数据库分析师则称其为记录(record)和字段(field),数据挖掘和机器学习学科的研究者则把它们叫作示例(example)和属性(attribute)。我们在本书中通篇使用术语观测和变量。
你可以清楚地看到此数据集的结构(本例中是一个矩形数组)以及其中包含的内容和数据类型。在表2-1所示的数据集中,PatientID是行/实例标识符,AdmDate是日期型变量,Age是连续型变量,Diabetes是名义型变量,Status是有序型变量。
R中有许多用于存储数据的结构,包括标量向量数组数据框列表。表2-1实际上对应着R中的一个数据框。多样化的数据结构赋予了R极其灵活的数据处理能力。
R可以处理的数据类型(模式)包括数值型、字符型、逻辑型(TRUE/FALSE)、复数型(虚数)和原生型(字节)。在R中,PatientID、AdmDate和Age为数值型变量,而Diabetes和Status则为字符型变量。另外,你需要分别告诉R:PatientID是实例标识符,AdmDate含有日期数据,
Diabetes和Status分别是名义型和有序型变量。R将实例标识符称为rownames(行名),将类别型(包括名义型和有序型)变量称为因子(factors)。我们会在下一节中讲解这些内容,并在第3章中介绍日期型数据的处理。

2.2 数据结构

R拥有许多用于存储数据的对象类型,包括标量向量矩阵数组数据框列表
它们在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均有所不同。图2-1给出了这些数据结构的一个示意图。
在这里插入图片描述
在这里插入图片描述

2.2.1 向量

向量用于储存数值型、字符串或者逻辑型数据的一维数组。执行组合功能的函数**c()**可用来创建向量。各类向量如下所示:

 rm(list=ls())
a = c(1,2,3,4)
b = c("one","two","three")
c= c(TRUE,TRUE,TRUE,FALSE,TRUE)

这里,a是数值型向量,b是字符型向量,而c是逻辑型向量。注意,单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型)。同一向量中无法混杂不同模式的数据。
注意 标量是只含一个元素的向量,例如f <- 3、g <- "US"和h <- TRUE。它们用于保存常量。
通过在方括号中给定元素所处位置的数值,我们可以访问向量中的元素。例如,**a[c(2, 4)]**用于访问向量a中的第二个和第四个元素。更多示例如下:

a <- c("k", "j", "h", "a", "c", "m")
a[3]
[1] "h"
a[c(1, 3, 5)]
[1] "k" "h" "c"
a[2:6]
[1] "j" "h" "a" "c" "m"

最后一个语句中使用的冒号用于生成一个数值序列。例如,a <- c(2:6)等价于a <- c(2, 3, 4, 5, 6)

2.2.2 矩阵

2.2.2.1矩阵定义:

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

2.2.2.2 创建格式:

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

**vector:**矩阵的元素
**nrow:**指定矩阵的行数
**ncol:**指定矩阵的列数
**dimnames:**包含了可选的、以字符型向量表示的行名和列名
**byrow:**表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充
案例1:
代码:

y <- matrix(1:20, nrow=5, ncol=4)
y

结果:

  [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20

案例2:
代码:

cells <- c(1,26,24,68) 
rnames <- c("R1", "R2") 
cnames <- c("C1", "C2") 
mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE, # 按行填充
                     dimnames=list(rnames, cnames))
mymatrix

结果:

 C1 C2
R1  1 26
R2 24 68

案例3:
代码:

mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=FALSE, #按列填充
                   dimnames=list(rnames, cnames))
mymatrix

结果:

 C1 C2
R1  1 24
R2 26 68

2.2.2.3 矩阵元素的提取:

我们可以使用下标和方括号来选择矩阵中的行、列或元素。X[i,]指矩阵X中的第i行,X[,j]指第j列,X[i, j]指第i行第j 个元素。选择多行或多列时,下标i和j可为数值型向量,如代码所示:
案例1:
创建矩阵:

x <- matrix(1:10, nrow=2)
x

提取第二行:
代码:

x[2,]

结果:

[1]  2  4  6  8 10

提取第二列:
代码:

x[,2]

结果:
[1] 3 4
提取第1行,第4列位置的元素:
代码:

x[1,4]

结果:

[1] 7

提取第1行,第4、5列位置的元素
代码:

x[1, c(4,5)]

结果:

[1] 7 9

2.2.3 数组

2.2.3.1 数组定义:

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

2.2.3.2 数组创建格式:

myarray <- array(vector, dimensions, dimnames)

**vector:**数组中的数据
**dimensions:**是一个数值型向量,给出了各个维度下标的最大

**dimnames:**是可选的、各维度名称标签的列表

2.2.3.3 创建数组案例:

代码:

dim1 <- c("A1", "A2") 
dim2 <- c("B1", "B2", "B3") 
dim3 <- c("C1", "C2", "C3", "C4") 
z <- array(1:24, c(2, 3, 4), dimnames=list(dim1, dim2, dim3))

结果:

, , C1

   B1 B2 B3
A1  1  3  5
A2  2  4  6

, , C2

   B1 B2 B3
A1  7  9 11
A2  8 10 12

, , C3

   B1 B2 B3
A1 13 15 17
A2 14 16 18

, , C4

   B1 B2 B3
A1 19 21 23
A2 20 22 24

如你所见,数组是矩阵的一个自然推广。它们在编写新的统计方法时可能很有用。像矩阵一样,数组中的数据也只能拥有一种模式。从数组中选取元素的方式与矩阵相同。上例中,元素z[1,2,3]为15。

2.2.4 数据框

2.2.4.1 数据框定义:

由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更为一般。它与你通常在SAS、SPSS和Stata中看到的数据集类似。数据框将是你在R中最常处理的数据结构。
表2-1所示的病例数据集包含了数值型和字符型数据。由于数据有多种模式,无法将此数据集放入一个矩阵。在这种情况下,使用数据框是最佳选择。
数据框可通过函数*data.frame()*创建:

2.2.4.2 数据框创建格式:

 mydata <- data.frame(col1, col2, col3,...)

其中的列向量col1、col2、col3等可为任何类型(如字符型、数值型或逻辑型)。每一列的名称可由函数names指定。代码清单2-4清晰地展示了相应用法。

2.2.4.3 数据框案例:

代码:

patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52) 
diabetes <- c("Type1", "Type2", "Type1", "Type1") 
 status <- c("Poor", "Improved", "Excellent", "Poor") 
patientdata <- data.frame(patientID, age, diabetes, status) 
 patientdata

结果:

patientID age diabetes    status
1         1  25    Type1      Poor
2         2  34    Type2  Improved
3         3  28    Type1 Excellent
4         4  52    Type1      Poor

每一列数据的模式必须唯一,不过你却可以将多个模式的不同列放到一起组成数据框。由于数据框与分析人员通常设想的数据集的形态较为接近,我们在讨论数据框时将交替使用术语列和变量。

2.2.4.4 数据框数据读取:

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

 patientdata[1:2] # 读取第1、2列

结果:

 patientID age
1         1  25
2         2  34
3         3  28
4         4  52

案例2:
代码:

patientdata[c("diabetes", "status")] # 读取diabetes、status列

结果:

 diabetes    status
1    Type1      Poor
2    Type2  Improved
3    Type1 Excellent
4    Type1      Poor

案例3:
代码:

patientdata$age # 读取age列

结果:

[1] 25 34 28 52

第三个例子中的记号$是新出现的➊。它被用来选取一个给定数据框中的某个特定变量。例如,如果你想生成糖尿病类型变量diabetes和病情变量status的列联表
案例4:
代码:

table(patientdata$diabetes, patientdata$status)

结果:

Excellent Improved Poor
  Type1         1        0    2
  Type2         0        1    0

在每个变量名前都键入一次patientdata$可能会让人生厌,所以不妨走一些捷径。可以联合使用函数attach()和detach()或单独使用函数with()来简化代码。
1. attach()、detach()和with()
函数attach()可将数据框添加到R的搜索路径中。R在遇到一个变量名以后,将检查搜索路径中的数据框。以第1章中的mtcars数据框为例,可以使用以下代码获取每加仑行驶英里数(mpg)变量的描述性统计量,并分别绘制此变量与发动机排量(disp)和车身重量(wt)的散点图:
代码:

summary(mtcars$mpg)

结果:

 Min. 1st Qu.  Median    Mean 3rd Qu. 
  10.40   15.43   19.20   20.09   22.80 
   Max. 
  33.90 

代码:

plot(mtcars$mpg, mtcars$disp)

结果:
在这里插入图片描述
代码:

plot(mtcars$mpg, mtcars$wt)

结果:
在这里插入图片描述
以上代码也可写成:
代码:

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

结果:
同上
函数detach()将数据框从搜索路径中移除。值得注意的是,detach()并不会对数据框本身做任何处理。这句是可以省略的,但其实它应当被例行地放入代码中,因为这是一个好的编程习惯。(接下来的几章中,为了保持代码片段的简约和简短,我可能会不时地忽略这条良训。)
当名称相同的对象不止一个时,这种方法的局限性就很明显了。考虑以下代码:

在这里插入图片描述
这里,在数据框mtcars被绑定(attach)之前,你们的环境中已经有了一个名为mpg的对象。在这种情况下,原始对象将取得优先权,这与你们想要的结果有所出入。由于mpg中有3个元素而disp中有32个元素,故plot语句出错。函数attach()和detach()最好在你分析一个单独的数据框,并且不太可能有多个同名对象时使用。任何情况下,都要当心那些告知某个对象已被屏蔽(masked)的警告。
除此之外,另一种方式是使用函数with()。可以这样重写上例:
代码:

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

在这种情况下,花括号{}之间的语句都针对数据框mtcars执行,这样就无需担心名称冲突了。如果仅有一条语句(例如summary(mpg)),那么花括号{}可以省略。

在这里插入图片描述
在这里插入图片描述
2. 实例标识符
在病例数据中,病人编号(patientID)用于区分数据集中不同的个体。在R中,实例标识符(case identifier)可通过数据框操作函数中的rowname选项指定。例如,语句:
代码:

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

结果:

patientID age diabetes    status
1         1  25    Type1      Poor
2         2  34    Type2  Improved
3         3  28    Type1 Excellent
4         4  52    Type1      Poor

将patientID指定为R中标记各类打印输出和图形中实例名称所用的变量。

2.2.5 因子

如你所见,变量可归结为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别变量。糖尿病类型Diabetes(Type1、Type2)是名义型变量的一例。即使在数据中Type1编码为1而Type2编码为2,这也并不意味着二者是有序的。有序型变量表示一种顺序关系,而非数量关系。病情Status(poor、improved、excellent)是顺序型变量的一个上佳示例。我们明白,病情为poor(较差)病人的状态不如improved(病情好转)的病人,但并不知道相差多少。
连续型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。年龄Age就是一个连续型变量,它能够表示像14.5或22.8这样的值以及其间的其他任意值。很清楚,15岁的人比14岁的人年长一岁。

2.2.5.1 因子定义:

类别(名义型)变量和有序类别(有序型)变量在R中称为因子**(factor)**。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。
函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
举例来说,假设有向量:
  diabetes <- c("Type1", "Type2", "Type1", "Type1")

语句diabetes <- factor(diabetes)将此向量存储为(1, 2, 1, 1),并在内部将其关联为1=Type1和2=Type2(具体赋值根据字母顺序而定)。针对向量diabetes进行的任何分析都会将其作为名义型变量对待,并自动选择适合这一测量尺度①的统计方法。

2.2.5.2 因子创建格式:

要表示有序型变量,需要为函数factor()指定参数ordered=TRUE。给定向量:

  status <- c("Poor", "Improved", "Excellent", "Poor")
  status <- factor(status, ordered=TRUE)
语句status <- factor(status, ordered=TRUE)会将向量编码为(3, 2, 1, 3),并在内部将这些值关联为1=Excellent、2=Improved以及3=Poor。另外,针对此向量进行的任何分析都会将其作为有序型变量对待,并自动选择合适的统计方法。

对于字符型向量,因子的水平默认依字母顺序创建。这对于因子status是有意义的,因为“Excellent”“Improved”“Poor”的排序方式恰好与逻辑顺序相一致。如果“Poor”被编码为“Ailing”,会有问题,因为顺序将为“Ailing”“Excellent”“Improved”。如果理想中的顺序是“Poor” “Improved”“Excellent”,则会出现类似的问题。按默认的字母顺序排序的因子很少能够让人满意。
你可以通过指定levels选项来覆盖默认排序。例如:

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

各水平的赋值将为1=Poor、2=Improved、3=Excellent。请保证指定的水平与数据中的真实值相匹配,因为任何在数据中出现而未在参数中列举的数据都将被设为缺失值。
数值型变量可以用levels和labels参数来编码成因子。如果男性被编码成1,女性被编码成2,则以下语句:

 sex <- factor(sex, levels=c(1, 2), labels=c("Male", "Female"))

2.2.5.3 因子案例:

下列演示了普通因子和有序因子的不同是如何影响数据分析的。
案例1:
在这里插入图片描述
首先,以向量的形式输入数据➊。然后,将diabetes和status分别指定为一个普通因子和一个有序型因子。最后,将数据合并为一个数据框。函数str(object)可提供R中某个对象(本例中为数据框)的信息➋。它清楚地显示diabetes是一个因子,而status是一个有序型因子,以及此数据框在内部是如何进行编码的。注意,函数summary()会区别对待各个变量➌。它显示了连续型变量age的最小值、最大值、均值和各四分位数,并显示了类别型变量diabetes和status(各水平)的频数值。

2.2.6 列表

2.2.6.1 列表定义:

列表(list)是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象(或成分,component)的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。

2.2.6.2 列表创建方式:

mylist <- list(object1, object2, ...)

其中的对象可以是目前为止讲到的任何结构。你还可以为列表中的对象命名:

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

2.2.6.3 列表创建案例:

代码:

 g <- "My First List" 
 h <- c(25, 26, 18, 39) 
 j <- matrix(1:10, nrow=5) 
 k <- c("one", "two", "three") 
 mylist <- list(title=g, ages=h, j, k)
 mylist  # 输出整个列表

结果:

$title
[1] "My First List"

$ages
[1] 25 26 18 39

[[3]]
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

[[4]]
[1] "one"   "two"   "three"

代码:

 mylist[[2]] # 输出第二个成分

结果:

[1] 25 26 18 39

代码:

mylist[["ages"]]

结果:

[1] 25 26 18 39

本例创建了一个列表,其中有四个成分:一个字符串、一个数值型向量、一个矩阵以及一个字符型向量。可以组合任意多的对象,并将它们保存为一个列表。
你也可以通过在双重方括号中指明代表某个成分的数字或名称来访问列表中的元素。此例中,mylist[[2]]和mylist[[“ages”]]均指那个含有四个元素的向量。对于命名成分,mylist$ages也可以正常运行。由于两个原因,列表成为了R中的重要数据结构。首先,列表允许以一种简单的方式组织和重新调用不相干的信息。其次,许多R函数的运行结果都是以列表的形式返回的。需要取出其中哪些成分由分析人员决定。你将在后续各章发现许多返回列表的函数示例。

在这里插入图片描述

2.3 数据的输入

在这里插入图片描述

2.3.1 使用键盘输入数据

代码:

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

2.3.2 从带分隔符的文本文件导入数据

你可以使用**read.table()**从带分隔符的文本文件中导入数据。此函数可读入一个表格格式的文件并将其保存为一个数据框。表格的每一行分别出现在文件中每一行。其语法如下:

 mydataframe <- read.table(file, options)

**file:**是一个带分隔符的ASCII文本文件
**options:**是控制如何处理数据的选项。
在这里插入图片描述
考虑一个名为studentgrades.csv的文本文件,它包含了学生在数学、科学、和社会学习的分数。文件中每一行表示一个学生,第一行包含了变量名,用逗号分隔。每一个单独的行都包含了学生的信息,它们也是用逗号进行分隔的。文件的前几行如下:
在这里插入图片描述
这个文件可以用以下语句来读入成一个数据框:
代码:

grades <- read.table("studentgrades.csv", header=TRUE, 
 row.names="StudentID", sep=",")

结果:

 First Last Math Science Social.Studies 
11 Bob Smith 90 80 67 
12 Jane Weary 75 NA 80 
10 Dan Thornton, III 65 75 70 
40 Mary O'Leary 90 95 92

在这里插入图片描述

2.3.3 导入 Excel 数据

xlsx包可以用来对Excel 97/2000/XP/2003/2007文件进行读取、写入和格式转换。函数read.xlsx()导入一个工作表到一个数据框中。最简单的格式是read.xlsx(file, n),其中file是Excel工作簿的所在路径,n则为要导入的工作表序号。举例说明,在Windows上,以下代码:

  library(xlsx) 
workbook <- "c:/myworkbook.xlsx" 
mydataframe <- read.xlsx(workbook, 1)

从位于C盘根目录的工作簿myworkbook.xlsx中导入了第一个工作表,并将其保存为一个数据框mydataframe。
函 数**read.xlsx()**有些选项可以允许你指定工作表中特定的行(rowIndex)和列(colIndex),配合上对应每一列的类(colClasses)。*对于大型的工作簿(比如说,100 000+个单元格),你也可以使用*read.xlsx2()函数。这个函数用Java来运行更加多的处理过程,因此能够获得可观的质量提升。请查阅help(read.xlsx)获得更多细节。

2.3.4 导入 XML 数据

以XML格式编码的数据正在逐渐增多。R中有若干用于处理XML文件的包。例如,由Duncan Temple Lang编写的XML包允许你读取、写入和操作XML文件。XML格式本身已经超出了本书的范围。对使用R存取XML文档感兴趣的读者可以参阅www.omegahat.org/RSXML,从中可以找到若干份优秀的软件包文档。

2.3.5 从网页抓取数据

在这里插入图片描述

2.3.6 导入 SPSS 数据

IBM SPSS数据集可以通过foreign包中的函数**read.spss()导入到R中,也可以使用Hmisc包中的spss.get()**函数。函数spss.get()是对read.spss()的一个封装,它可以为你自动设置后者的许多参数,让整个转换过程更加简单一致,最后得到数据分析人员所期望的结果。
首先,下载并安装Hmisc包(foreign包已被默认安装):

install.packages("Hmisc") 

然后使用以下代码导入数据:

library(Hmisc) 
mydataframe <- spss.get("mydata.sav", use.value.labels=TRUE)
这段代码中,mydata.sav是要导入的SPSS数据文件,use.value.labels=TRUE表示让函数将带有值标签的变量导入为R中水平对应相同的因子,mydataframe是导入后的R数据框。

2.3.7 导入 SAS 数据

R中设计了若干用来导入SAS数据集的函数,包括foreign包中的**read.ssd()**,Hmisc包中的**sas.get()**,以及sas7bdat包中的 **read.sas7bdat()**。如果你安装了SAS,sas.get()是一个好的选择。
比如说,你想导入一个名为clients.sas7bdat的SAS数据集文件,它位于一台Windows机器上的C:/mydata文件夹中,以下代码导入了数据,并且保存为一个R数据框:
 library(Hmisc) 
datadir <- "C:/mydata" 
sasexe <- "C:/Program Files/SASHome/SASFoundation/9.4/sas.exe" 
mydata <- sas.get(libraryName=datadir, member="clients", sasprog=sasexe)
**libraryName是一个包含了SAS数据集的文件夹,member是数据集名字(去除掉后缀名sas7bdat),sasprog是到SAS可运行程序的完整路径。有很多可用的选项;查看help(sas.get)获得更多细节。**

2.3.8 导入 Stata 数据

要将Stata数据导入R中非常简单直接。所需代码类似于:

 library(foreign) 
mydataframe <- read.dta("mydata.dta")

这里,mydata.dta是Stata数据集,mydataframe是返回的R数据框。

2.3.9 导入 NetCDF 数据

 Unidata项目主导的开源软件库NetCDF(Network Common Data Form,网络通用数据格式)定义了一种机器无关的数据格式,可用于创建和分发面向数组的科学数据。NetCDF格式通常用来存储地球物理数据。ncdf包和ncdf4包为NetCDF文件提供了高层的R接口。
 ncdf包为通过Unidata的NetCDF库(版本3或更早)创建的数据文件提供了支持,而且在Windows、Mac OS X和Linux上均可使用。ncdf4包支持NetCDF 4或更早的版本,但在Windows上尚不可用。

2.3.10 导入 HDF5 数据

HDF5(Hierarchical Data Format,分层数据格式)是一套用于管理超大型和结构极端复杂数据集的软件技术方案。rhdf5包为R提供了一个HDF5的接口。这个包在Bioconductor网站上而不是CRAN上提供。你可以用以下代码对之进行安装:
   source("http://bioconductor.org/biocLite.R") 
   biocLite("rhdf5")
像XML一样,HDF5格式超出了本书的内容范围。如果想学习更多相关知识,可访问HDF Group 网站( http://www.hdf5group.org/ )。 由 Bernd Fischer 编写的 http://www.bioconductor.org/packages/release/bioc/vignettes/rhdf5/inst/doc/rhdf5.pdf是一个rhdf5包的优秀指南。

2.3.11 访问数据库管理系统

  1. ODBC接口
  2. DBI相关包

2.4 数据集的标注

为了使结果更易解读,数据分析人员通常会对数据集进行标注。这种标注包括为变量名添加描述性的标签,以及为类别型变量中的编码添加值标签。例如,对于变量age,你可能想附加一个描述更详细的标签“Age at hospitalization (in years)”(入院年龄)。对于编码为1或2的性别变量gender,你可能想将其关联到标签“male”和“female”上。

2.4.1 变量标签

遗憾的是,R处理变量标签的能力有限。一种解决方法是将变量标签作为变量名,然后通过位置下标来访问这个变量。考虑之前病例数据框的例子。名为age的第二列包含着个体首次入院时的年龄。代码:

names(patientdata)[2] <- “Age at hospitalization (in years)”
将age重命名为"Age at hospitalization (in years)“。很明显,新的变量名太长,不适合重复输入。作为替代,你可以使用patientdata[2]来引用这个变量,而在本应输出age的地方输出字符串"Age at hospitalization (in years)”。很显然,这个方法并不理想,如果你能尝试想出更好的命名(例如,admissionAge)可能会更好一点。

2.4.2 值标签

函数factor()可为类别型变量创建值标签。继续上例,假设你有一个名为gender的变量,

其中1表示男性,2表示女性。你可以使用代码:

patientdata$gender <- factor(patientdata$gender, 
 levels = c(1,2), 
 labels = c("male", "female"))

这里levels代表变量的实际值,而labels表示包含了理想值标签的字符型向量。

2.5 处理数据对象的实用函数

我们来简要总结一下实用的数据对象处理函数:
在这里插入图片描述
在这里插入图片描述
我们已经讨论过其中的大部分函数。函数**head()tail()**对于快速浏览大数据集的结构非常有用。例如,head(patientdata)将列出数据框的前六行,而*tail(patientdata)将列出最后六行。*我们将在下一章中介绍length()、cbind()和rbind()等函数。我们将其汇总于此,仅作参考。

2.6 参考来源:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可变形卷积DCN/DConv

1、定义 可变形卷积是指卷积核在每一个元素上额外增加了一个方向参数&#xff0c;这样卷积核就能在训练过程中扩展到很大的范围&#xff0c;卷积核可以变成任意方向。 图(a)是普通卷积 图(b)、©、(d)是可变形卷积&#xff0c;©(d)是(b)的特例 2、为什么要使用可变…

Nginx配置负载均衡到网关

Nginx配置负载均衡到网关 1.需求图示 前置准备工作 https://blog.csdn.net/qq_44981526/article/details/128599898 2.配置实现 1.在C:\Windows\System32\drivers\etc目录下修改hosts文件 #配置llpliving.com nginx虚拟机 192.168.56.100 www.llpliving.com2.配置nginx负载…

【C++】优先级队列priority_queue仿函数

这里先简单介绍一下优先级队列priority_queue&#xff1a;优先队列是一种容器适配器,默认的情况下&#xff0c;如果没有为特定的priority_queue类实例化指容器类&#xff0c;则使用vector (deque 也是可以的),需要支持随机访问迭代器&#xff0c;以便始终在内部保持堆结构 文章…

Springboot配置静态资源

目录 1. springboot默认的静态资源存放路径 2.Springboot添加静态资源映射addResourceHandlers addResourceLocations 3.坑 如果方法一和二同时配置 那么就会遵循方法二 方法一的静态文件将找不到 1. springboot默认的静态资源存放路径 静态资源的存放路径为classpath,也就是…

【卷积码系列4】卷积码的状态转移函数、距离谱和译码性能界分析及matlab仿真

一、卷积码的状态图和转移函数 以一个例子入手,对于如下编码器所示的码率1/3卷积码 根据输入和寄存器状态,可以得到其状态图如下所示 图中虚线表示输入比特为1时的转移,而实线表示输入比特为0时的转移 同样,图中虚线表示输入比特为1时的转移,而实线表示输入比特为0…

Diffusion Models从入门到放弃:必读的10篇经典论文

前言&#xff1a;diffusion models是现在人工智能领域最火的方向之一&#xff0c;并引爆了AIGC方向&#xff0c;一大批创业公司随之诞生。笔者2021年6月开始研究diffusion&#xff0c;见证了扩散模型从无人问津到炙手可热的过程&#xff0c;这些篇经典论文我的专栏里都详细介绍…

从0到1完成一个Vue后台管理项目(五、登录页(表单校验的使用和封装))

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

IDEA的使用

1.安装 官网: https://www.jetbrains.com/IDEA 工作界面介绍 2.使用技巧 √设置字体和颜色主题 菜单 file -> settings √字符编码设置 可以自己设置快捷键 常用快捷键&#xff1a;删除当前行, 默认是 ctrl Y 自己配置 ctrl d复制当前行, 自己配置 ctrl alt 向下光…

10、可观测性--系统告警

文章目录告警的作用告警数据来源黑盒白盒日志统计指标链路追踪故障分类告警的作用 在没有告警的时候&#xff0c;我们一般是人工定期地查看相关的指标或者链路数据&#xff0c;再去程序上确认。虽然人工也能监控&#xff0c;但有时还是难以判定是否真的出现了问题&#xff0c;…

【云原生进阶之容器】第二章Controller Manager原理2.6节--Informer controller

6 Informer 的 controller DeltaFIFO 是一个非常重要的组件,真正让他发挥价值的,便是 Informer 的 controller。 虽然 Kubernetes 源码中的确用的是 controller 这个词,但是此 controller 并不是 Deployment Controller 这种资源控制器。而是一个承上启下的事件控制器(从 A…

Java并发编程学习14-任务关闭(下)

任务关闭&#xff08;下&#xff09; 《任务关闭》由于篇幅较多&#xff0c;拆分了两篇来介绍各种任务和服务的关闭机制&#xff0c;以及如何编写任务和服务&#xff0c;使它们能够优雅地处理关闭。 1. 处理非正常的线程终止 我们知道&#xff0c;当单线程的控制台程序由于…

Urban NeRF

本文首发于馆主君晓的博客&#xff0c;文章链接 简要介绍 这是谷歌和多伦多大学合作的一篇发表在CVPR2022上的工作&#xff0c;延续NeRF重建的相关思路。考虑到之前的一些工作要么是在合成数据集上进行的NeRF重建&#xff0c;要么就是用到真实的场景&#xff0c;但是场景很小&a…

JDK1.8和JDK1.7的HashMap源码分析以及线程不安全问题

参考&#xff1a; 教你如何阅读HashMap源码~吊打面试官 - 腾讯云开发者社区-腾讯云 (tencent.com) 有一些面试题 Map - HashSet & HashMap 源码解析 | Java 全栈知识体系 (pdai.tech) HashMap源码&底层数据结构分析 | JavaGuide(Java面试学习指南) hashmap头插法和尾插…

LAB1 VRRP实验

■实验拓扑 ■实验需求 多厂商的网关冗余&#xff08;VRPP&#xff09; 考虑上行/上上行/下行链路的之间的track 生成树配置 VPC能访问R4的loopback口地址&#xff08;8.8.8.8&#xff09; ■实验步骤 ▶思科路由器CISCO-R4 Router(config)#hostname CISCO-R4 CISCO-…

【博客581】为什么MASQUERADE都在POSTROUTING做

为什么MASQUERADE都在POSTROUTING做 MASQUERADE都在POSTROUTING做&#xff0c;为什么不能在output做 1、iptables flow graph&#xff1a; 2、output之后的routing和rerouting&#xff1a; 对于本机 app 发出(outcoming)的流量&#xff0c;netfilter 有2次 routing 过程&…

算法刷题打卡第59天:相交链表

相交链表 难度&#xff1a;简单 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 …

空洞卷积atrous/dilated convolution

1、定义 空洞卷积&#xff08;atrous/dilated convolution&#xff09;又称膨胀卷积是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。空洞卷积向卷积层引入了一个称为“扩张率/膨胀率(dilation rate)”的新参数&#xff0c;该参数定义了卷积核…

Excel 个人财务:如何在 Excel 模板中创建预算

wpcmf “金钱是一种工具。使用得当&#xff0c;它会变得美丽——使用不当&#xff0c;它会变得一团糟&#xff01;” – 布拉德利文森 正确使用金钱需要纪律。在本教程中&#xff0c;我们将了解如何使用 Excel 进行个人财务以正确管理我们的预算和财务。我们将涵盖以下主题。 …

Java使用spire进行word文档的替换

前言 今天遇到一个需求&#xff0c;需要对word模板进行替换制定的变量 在网上找了很多方案&#xff0c;做了很多的demo&#xff0c;下面就把我觉得比较简单的一种分享给大家 本次的主角是&#xff1a;spire.doc spire.doc是专门实现对word的操作&#xff08;包括文字&#…

「数据密集型系统搭建」原理篇|OLAP、OLTP,竟是两个世界

本篇来聊聊OLAP与OLTP的区别以及它们各自的适用场景&#xff0c;以此话题为导引和大家聊聊技术视野与知识储备对于研发同学的重要性&#xff0c;最后站在事务处理与在线分析的角度分别论述下两个数据世界的底层构建逻辑。 OLAP、OLTP的概念与区别 概念 了解OLAP、OLTP的概念&…