第4章--基本数据管理

4.1 创建新变量

在典型的项目研究中,你可能需要创建新的变量或者对现有的变量进行变换。这可以通过以下语句来完成:

                  变量名←表达式

以上语句中的表达式部分可以分成包含多种运算符合函数。

例如,一个名为mydata的数据框,其中的变量为x1和x2,现在需要创建一个新的变量sumx存储以上两个变量的加和,并创建一个名为meanx的新变量存储这两个变量的均值:

 

4.2 变量的重编码

重编码涉及根据同一个变量和/或其他变量的现有值创建新值的过程。其中涉及到:

  • 将一个连续型变量修改为一组类别值;
  • 将误编码的值替换为正确值;
  • 基于一组分数线创建一个表示及格/不及格的变量

例如要将leadership中的经理人的连续型变量age重编码为类别型变量agecat(Young, Middle Aged, Elder):

使用的语句为:

leadership$age[leadership$age == 99] <- NA

下列语句将仅在condition的值为TRUE时执行赋值:

variable[condition] <- expression
leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age >= 55 & <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 55] <- "Young"

这段代码可以改写成更紧凑的:

leadership <- within(leadership, {
                                agecat <- NA
                                agecat[age > 75]                  <- "Elder"
                                agecat[age >= 55 & <=75]   <- "Middle Aged"
                                agecat[age < 55]                  <- "Young" })

函数within(),它允许你修改数据框。

 

4.3 变量的重命名

可以使用一个fix()的函数来调用一个交互式的编辑器,单击变量名然后在弹出的对话框中将其重命名。

或者,

reshape包中有一个rename()函数可以用来修改变量名。

rename(dataframe, c(oldname="newname",))

示例:

library(reshape)
leadership <- rename(leadership, c(manager="managerID", date="testDate"))

最后,可以用names()函数来重命名变量:

names(leadership)[2] <- "testDate"

 

4.4 缺失值

在R中,缺失值以符号NA表示。不可能出现的值用NaN表示。

函数is.na()允许你检测缺失值是否存在,如果某个元素是缺失值,相对应的位置将被改成TRUE,不是缺失值的位置则为FALSE。

> y <- c(1, 2, 3, NA)
> is.na(y)
[1] FALSE FALSE FALSE  TRUE

含有缺失值的算术表达式和函数的计算结果也都是缺失值。

> x <- c(1, 2, NA, 3)
> y <- x[1] + x[2] + x[3] + x[4]
> z <- sum(x)
> is.na(y)
[1] TRUE
> is.na(z)
[1] TRUE

好在多数的数值函数都有一个na.rm=TRUE的选项,可以在计算之前移除缺失值并使用剩余的值进行计算。

> y <- sum(x, na.rm=TRUE)
> is.na(y)
[1] FALSE

通过函数na.omit()移除所有含有缺失值的观测。

 

4.5 日期值

日期值通常以字符串的形式输入到R中,然后转换为以数值形式存储的日期变量。函数as.Date()用于执行这种转换。格式为:

as.Date(x, "input_format")

日期的默认输入格式为:yyyy-mm-dd

> strDates <- c("01/05/1965","08/06/1975")
> dates <- as.Date(strDates, "%m/%d/%Y")
> dates
[1] "1965-01-05" "1975-08-06"

或者

> myformat <- "%m/%d/%Y"
> dates <- as.Date(strDates, myformat)
> dates
[1] "1965-01-05" "1975-08-06"

 

有两个函数对于处理时间戳数据特别实用。

Sys.Date()可以返回当天的日期;

data()返回当前的日期和时间。

> Sys.Date()
[1] "2017-04-24"
> date()
[1] "Mon Apr 24 12:22:05 2017"

format()函数可接受一个参数并按照某种格式输出结果,并且可以提取日期中的某些指定部分。

> today <- Sys.Date()
> format(today, format="%B %d %Y")
[1] "四月 24 2017"
> format(today, format="%A")
[1] "星期一"

difftime()函数可以用来计算时间间隔,并以星期,天,时,分,秒来表示。

> today <- Sys.Date()
> dob <- as.Date("1956-10-12")
> difftime(today, dob, units="weeks")
Time difference of 3158.429 weeks

as.character()函数可以将日期值转换为字符型。

strDates <- as.character(dates)

 

4.6 类型转换

名为is.datatype()这样的函数返回TRUE or FALSE,而as.datatype()这样的函数则将其参数转换为对应的类型。

> a <- c(1, 2, 3)
> a
[1] 1 2 3
> is.numeric(a)
[1] TRUE
> is.vector(a)
[1] TRUE

> a <- as.character(a)
> a
[1] "1" "2" "3"
> is.numeric(a)
[1] FALSE
> is.vector(a)
[1] TRUE
> is.character(a)
[1] TRUE

 

4.7 数据排序

在R中,可以使用order()函数对一个数据框进行排序,默认的排序顺序是升序,在排序变量的前面加一个负号即得到降序的排序结果。

newdata <- leadership[order(gender, -age)]

 

4.8 数据集合并

要横向合并两个数据框,请使用merge()函数。在多数情况下,两个数据框是通过一个或多个共有变量进行联结的。

total <- merge(dataframeA, dataframeB, by="ID")

如果要直接横向合并两个矩阵或数据框,并且不需要指定一个公共索引,那么可以直接使用cbind()函数

total <- cbind(A, B)

要纵向合并两个数据框,请使用rbind()函数。两个数据框必须拥有相同的变量,不过他们的顺序不一定要相同。

total <- rbind(dataframeA, dataframeB)

 

4.9 数据集取子集

1. 选入(保留)变量

数据框中的元素是通过dataframe[row indices, column indices]来访问的。

2. 剔除(丢弃)变量

myvars <- names(leadership) %in% c("q3", "q4")
newdata <- leadership[!myvars]

3. 选入观测

选择第一行和第三行进行观测:

newdata <- leadership[1:3,]

选择所有30岁以上的男性:

newdata <- leadership[which(leadership$gender=="M" & leadership$age > 30),]

4. subset()函数

newdata <- subset(leadership, age>= 35 | age<=24, select=c(q1,q2,q3,q4))
newdata <- subset(leadership, gender=="M" & age>25, select=gender:q4)

 

posted @ 2016-10-09 21:59  cyoutetsu  阅读(285)  评论(0编辑  收藏  举报