R第四章:基本数据管理

创建新变量

变量名 <- 表达式

表达式可以包含多种运算符和函数。

+ , - , * , / , ^ 或 * *(求幂),x%%y (求余),x%/%y (整数除法)

#第一种
mydata <- data.frame(x1= c(2, 2, 6, 4),
                                    x2= c(3, 4, 2, 8))
mydata$sumx <- mydata$x1 + mydata$x2
mydata$meanx <- (mydata$x1 + mydata$x2) / 2

#第二种
attach(mydata)
mydata$sumx <- x1 + x2
mydata$meanx <- (x1 + x2) /2
detach(mydata)

#第三种
mydata <- transform(mydata, 
                    sumx = x1 + x2,
                    meanx = (x1 + x2) / 2)

transform()函数简化了按需创建新变量并将其保存到数据框中的过程。

变量的重编码

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

语句variable[condition] <- expression 将仅在condition的值为TRUE时执行赋值

 

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

 

函数within()与函数with()类似,不同的是它允许修改数据框。首先,创建了agecat变量,并将每一行都设为缺失值。括号中剩下的语句接下来依次执行。

变量的重命名

1,交互式地修改

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

2,编程式地修改

names()函数来重命名变量。

#查看leadership数据框的所有变量名
names(leadership)

#将leadership的第二个变量进行重命名
names(leadership)[2] <- "testDate"

#重命名多个变量名
names(leadership)[6:10] <- c("item1", "item2", "item3", "item4", "item5")

plyr包中的rename()函数,使用格式为:

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

#安装plyr包
install.packages("plyr")
library(plyr)
leadership <- rename(leadership,
                     c(manager="managerID", date="testDate"))

缺失值

在R中,缺失值以符号NA(Not Available,不可用)表示。R中字符型和数值型数据使用的缺失值符号是相同的。

函数is.na()用来检测缺失值是否存在。返回一个与检测对象相同大小的对象,如果某个元素是缺失值,相应的位置将被改写为TRUE,不是缺失值的位置则为FALSE.

y <- c(1, 2, 3, NA)
#使用函数is.na()
is.na(y)
#返回
FALSE, FALSE, FALSE, TRUE

***注意:

1,缺失值被认为是不可比较的,即便是与缺失值自身的比较。不能使用比较运算符来检测缺失值是否存在。

例如:逻辑测试var == NA 的结果永远不会为TRUE.

2,R并不把无限的或者不可能出现的数值标记成缺失值。

正无穷和负无穷分别用Inf和-Inf标记。不可能的值(比如,sin(Inf))用NaN来标记(not a number,不是一个数)如果要识别这些数值,需要用到is.infinite()或

is.nan().

  一,重编码某些值为缺失值

  在分析之前确保所有的缺失数据都被妥善低编码为缺失值,否则分析结果将失去意义。

  二,在分析中排除缺失值

  在分析之前需要进一步以某种方式删除缺失值。因为含有缺失值的算术表达式和函数的计算结果也是缺失值。

x <- c(1, 2, NA, 3)
y <- x[1] + x[2] + x[3] + x[4]
z <- sum(x)
#由于x中的第3个元素是缺失值,所以y和z也都是NA。
#使用na.rm=TRUE选项
 y <- sum(x,  na.rm=TRUE)

 

***na.rm=TRUE选项,可以在计算之前移除缺失值并使用剩余值进行计算。

函数na.omit()可以删除所有含有缺失数据的行。

日期值

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

其中x是字符型数据,input_format则给出用于读入日期的适当格式。

%d  数字表示的日期(0-31)  %a  缩写的星期名(Mon)    %A  非缩写星期名(Monday)

%m    月份(00-12)       %b  缩写的月份(Jan)      %B  非缩写月份(January)

%y  两位数的年份(07)    %Y  四位数的年份(2007)

 

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

#不知道为啥输出的日期格式都是yyyy-mm-dd,而不是%m/%d/%Y 这样形式的

 

Sys.Date() 返回当天的日期,date() 返回当前的日期和时间。

format(x, format="output_format") 输出指定格式的日期值,并且可以提取日期值中的某些部分。

format(today, format="%B %d %Y")
[1] "十一月 02 2017"
format(today, format="%A")
[1] "星期四"

日期可以用来执行算术运算。

startdate <- as.Date("2004-02-13")
enddate <- as.Date("2011-01-22")
days <- enddate - startdate
days
Time difference of 2535 days

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

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

将日期转换为字符型变量

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

类型转换

判断函数:is.numeric() is.character() is.vector() is.matrix() is.data.frame() is.factor() is.logical()

转换:as.numeric() as.character() as.vector() as.matrix() as.data.frame() as.factor() as.logical()

数据排序

order()函数对一个数据框进行排序,默认的排序顺序是升序。在排序变量的前边加一个减号即可得到降序的排序结果。

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

数据集的合并

1,向数据框添加列

多数情况下,两个数据框是通过一个或多个共有变量进行联结的。可以使用merge()函数

#将dataframeA和dataframeB按照ID进行了合并
total <- merge(dataframeA, dataframeB, by="ID")

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

total <- cbind(A, B)

要保证每个对象必须拥有相同的行数,以同顺序排序。

2,向数据框添加行

纵向合并两个数据框,使用rbind()函数。

total <- rbind(dataframeA, dataframeB)

两个数据框必须拥有相同的变量,不过它们的顺序不必一定相同。(这句话理解有点问题)

如果dataframeA中拥有dataframeB中没有的变量,需要在合并之前先做处理:

1,删除dataframeA中的多余变量。

2,在dataframeB中创建追加的变量并将其值设为NA(缺失)。

数据集取子集

1,选入(保留)变量

#1,通过dataframe[row indices, column indices]访问
newdata <- leadership[, c(6:10)]
#2,变量名
myvars <- c("q1", "q2", "q3", "q4", "q5")
newdata <- leadership[myvars]
#paste()函数
myvars <- paste("q", 1:5, sep=" ")
newdata <- leadership[myvars]

2,剔除(丢弃)变量

#剔除 q3, q4两列
#names(leadership) %in% c("q3", "q4") 返回一个逻辑型向量,匹配q3或q4的元素值为TRUE
myvars <- names(leadership) %in% c("q3", "q4")
newdata <- leadership[!myvars]

#在某一列的下标之前加一个减号(-)就会剔除那一列
newdata <- leadership[c(-8, -9)]

#设为NULL(未定义),NULL与NA是不同的
leadership$q3 <- leadership$q4 <- NULL

3,选入观测

#通过设置下标来选入
newdata <- leadership[1:3, ]

#通过相应的条件来选入
newdata <- leadership[leadership$gender=="M" & leadership$age>30, ]

4,subset()函数

newdata <- subset(leadership, age >=35 | age <24,
                    select=c(q1, q2, q3, q4,))

#冒号运算符 from:to
newdata <- subset(leadership, gender=="M" & age >25,
                    select=gender:q4)

5,随机抽样

sample()函数能够让你从数据集中(有放回或无放回地)抽取大小为n的一个随机样本。

mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE) , ]

sample()函数中的第一个参数是一个由要从中抽样的元素组成的向量。第二个参数是要抽取的元素数量。第三个参数表示无放回抽样。

使用SQL 语句操作数据框

install.packages("sqldf")
library(sqldf)
#row.names=TRUE 将原始数据框中的行名延续到了新数据框中
newdf <- sqldf("select * from mtcars where carb=1 order by mpg", row.names=TRUE)

下载并安装好sqldf包,可以使用sqldf()函数在数据框上使用SQL中的SELECT语句。

 

转载于:https://www.cnblogs.com/xinlanzhang7319/p/7764445.html

你可能感兴趣的:(R第四章:基本数据管理)