1. 数据类型的转换
名为is.datatype的函数是判断其类型T或者F。名为as.datatype则是将其转换为对应的类型。
> a <- c(1,2,3)
> is.numeric(a)
[1] TRUE
> is.vector(a)
[1] TRUE
> is.array(a)
[1] FALSE
> a<- as.character(a)
> a
[1] "1""2" "3"
> is.character(a)
[1] TRUE
2. 数据排序
使用order()函数可以对一个数据框进行排序,默认的排序顺序是升序,在排序变量前面加一个减号即可降序。
> newdata <- leadership[order(gender,age),]
> newdata
manager data country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
2 2 10/28/08 US F 45 3 5 2 5 5
5 5 5/1/09 US F 99 2 2 1 2 1
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
> newdata <- leadership[order(gender,-age),]
> newdata
manager data country gender age q1 q2 q3 q4 q5
5 5 5/1/09 US F 99 2 2 1 2 1
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
1 1 10/24/08 US M 32 5 4 5 5 5
这里要注意在order(gender,-age),有一个逗号,不能忽视。
有关排序的问题书上讲解略微简略,希望在以后能得到补充。
3. 数据集的合并
如果需要横向合并两个数据框,使用merge()函数,
> a_data_frame <- data.frame(x= letters[1:5],y= rnorm(5),z=runif(5)>0.5)
> a_data_frame
x y z
1 a -0.4173760 FALSE
2 b 0.6969445 FALSE
3 c -1.0920196 TRUE
4 d 0.2629294 TRUE
5 e -0.9772492 FALSE
> another_data_frame <- data.frame(z= rlnorm(5), y= sample(5),x= letters[3:7])
> another_data_frame
z y x
1 1.9464695 5 c
2 0.8450900 3 d
3 1.4593505 1 e
4 0.7406191 4 f
5 1.1054632 2 g
> merge(a_data_frame,another_data_frame,by= "x")
x y.x z.x z.y y.y
1 c -1.0920196 TRUE 1.946469 5
2 d 0.2629294 TRUE 0.845090 3
3 e -0.9772492 FALSE 1.459350 1
merge( 内使用by = “x” )即锁定x为共享ID 列,因为在这种情况下默认的all=FALSE,如果这时使用all =TRUE,则会
> merge(a_data_frame,another_data_frame,by= "x",all = TRUE)
x y.x z.x z.y y.y
1 a -0.4173760 FALSE NA NA
2 b 0.6969445 FALSE NA NA
3 c -1.0920196 TRUE 1.9464695 5
4 d 0.2629294 TRUE 0.8450900 3
5 e -0.9772492 FALSE 1.4593505 1
6 f NA NA 0.7406191 4
7 g NA NA 1.1054632 2
这既是a和another的并集,而默认情况下,all=FALSE,即使a和another的交集。 a和another 在merge时使用by可以取多个ID,这时就会有使其多个交集相同情况下的最终的交集。
行和列的合并
使用cbind可以横向合并,rbind可以纵向合并。为了方便理解,可以cbind为 col bind 级列锁定,这时即列不动,横向合并。 rbind是row bind ,行锁定,这时行不动,列合并。
4. 数据集的提取
4.1 选入保存的变量
可以通过data.frame[row,column]来进行选择变量,比如
> newdata <- leadership[,c(6:10)]
> newdata
q1 q2 q3 q4 q5
1 5 4 5 5 5
2 3 5 2 5 5
3 3 5 5 5 2
4 3 3 4 NA NA
5 2 2 1 2 1
这里就选择了第6列到第10列的相关变量。在行选择使用逗号则表示默认选择所有行。
如果你已知列名或者行名,则可以通过定义一个向量再通过向量进行[ ] 来进行变量选择。
比如:
> myvars <- c("q1","q2")
> leadership[myvars]
q1 q2
1 5 4
2 3 5
3 3 5
4 3 3
5 2 2
这里myvars 定义了向量是列名q1、q2 。 如果只是选择一个变量的话可以使用
> leadership["q1"]
q1
1 5
2 3
3 3
4 3
5 2
在这里需要注意q1 是字符型数值,所以需要在其加引号。
同样你也可以使用paste 来定义myvars向量
> myvars <- paste("q" , 1:5 , sep="")
> leadership[myvars]
q1 q2 q3 q4 q5
1 5 4 5 5 5
2 3 5 2 5 5
3 3 5 5 5 2
4 3 3 4 NA NA
5 2 2 1 2 1
有关paste函数在书后续章节会详细解释。这里点到为止。
4.2 删除变量
删除变量最简单的方法就是使用 - ,比如:
> newdata <- leadership[c(-8,-9)]
> newdata
manager data country gender age q1 q2 q5
1 1 10/24/08 US M 32 5 4 5
2 2 10/28/08 US F 45 3 5 5
3 3 10/1/08 UK F 25 3 5 2
4 4 10/12/08 UK M 39 3 3 NA
5 5 5/1/09 US F 99 2 2 1
这时 第8列和第9列就删除掉了。
同样我们可以通过
> myvars <- names(leadership) %in% c("q3","q4")
> myvars
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE
names函数定义了所有的leadership的名称,而%in%如下所示:
%in%
用法 a %in% table
a值是否包含于table中,为真输出TURE,否者输出FALSE
所以我们返回的值是除了q3、q4 两列均为false,即不包括。
然后我们在再通过:
> newdata <- leadership[!myvars]
> newdata
manager data country gender age q1 q2 q5
1 1 10/24/08 US M 32 5 4 5
2 2 10/28/08 US F 45 3 5 5
3 3 10/1/08 UK F 25 3 5 2
4 4 10/12/08 UK M 39 3 3 NA
5 5 5/1/09 US F 99 2 2 1
这里含义表达是!myvars ,即非myvars,所以就把q3,q4 剔除掉了。所以我们在检索时也可以通过逻辑值来判断。
同样我们可以通过
leadership$q3 <- leadership$q4 <-NULL 也可以达到此效果
4.3 选入观测
我们可以通过一些逻辑判断来选择需要观测的种类,
比如;
> newdata <- leadership[1:3,]
> newdata
manager data country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
选取了前三行, 1:3后的逗号表示默认保存每一列。
> newdata <- leadership[leadership$age >30&leadership$gender == "M",]
> newdata
manager data country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
这里同样可以看出需要观测的是大于30岁并且为男性的数据,同样需要记住在选取观测时要加入逗号保存所有列。同样我们可以通过with来进行相同的提取观测:
> with(leadership, newd <<- leadership[gender == "M"&age>30,])
> newd
manager data country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
with的局限在于其只在with内生效,如果需要永久赋值则需要<<- ,同时你也可以通过attach来进行提取。
书中还提供了对于leadership中提取date在2009年1月1日到2009年12月31日之间的变量,可以通过以下方法:
> leadership$data <- as.Date (leadership$data, "%m/%d/%y")
> startdate <- as.Date("2009-01-01")
> enddate <- as.Date("2009-12-31")
>
> newdata <- leadership[which(leadership$data >=startdate&leadership$data<= enddate),]
> newdata
manager data country gender age q1 q2 q3 q4 q5
5 5 2009-05-01 US F 99 2 2 1 2 1
先使用as.Date 将leadership内date变量变为时间变量,然后再通过设定将startdate和enddate 均定义为时间变量,由于时间变量默认为yyyy-mm-dd,所以不需要在使用相关的格式,然后通过甄选使用which函数ji可提取相应的值。
4.4 subset函数
使用subset函数可以快速的选择变量
比如:
> news <- subset(leadership,age>=35|age <24,select = c(q1,q2,q3,q4,q5))
> news
q1 q2 q3 q4 q5
2 3 5 2 5 5
4 3 3 4 NA NA
5 2 2 1 2 1
subset定义了年纪大于35或者小于24,并保留了变量q1到q5。
或者
> new2 <- subset(leadership,gender == "M" &age >25 , select = gender:q3)
> new2
gender age q1 q2 q3
1 M 32 5 4 5
4 M 39 3 3 4
保留了gender到q3的所有列。
4.5 sample
> mysample <- leadership[sample(1:nrow(leadership),3,replace = FALSE),]
> mysample
manager data country gender age q1 q2 q3 q4 q5
1 1 2008-10-24 US M 32 5 4 5 5 5
5 5 2009-05-01 US F 99 2 2 1 2 1
3 3 2008-10-01 UK F 25 3 5 5 5 2
sample(1:nrow(leadership),3,replace=FALSE)表示在leadership行中抽取一个从第一到其最后一行,随机抽取三个,无放回的行值,然后通过leadership来提取其整行。