R拥有强大的索引特性, 可以用于访问对象中的元素。 也可利用这些特性对变量或观测进行选入和排除。
总的来说,R中对象取子集,两种方式,R对象后面跟符号[]
并添加条件,或者使用函数。
继续以管理者服从度信息数据为例进行数据子集选取的说明。
manager <- c(1, 2, 3, 4, 5)
date <- c("10/24/08", "10/28/08", "10/1/08", "10/12/08", "5/1/09")
country <- c("US", "US", "UK", "UK", "UK")
gender <- c("M", "F", "F", "M", "F")
age <- c(32, 45, 25, 39, 99)
q1 <- c(5, 3, 3, 3, 2)
q2 <- c(4, 5, 5, 3, 2)
q3 <- c(5, 2, 5, 4, 1)
q4 <- c(5, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
leadership <- data.frame(manager, date, country, gender, age,
q1, q2, q3, q4, q5, stringsAsFactors=FALSE)
> print(leadership )
manager date 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
4 4 10/12/08 UK M 39 3 3 4 NA NA
5 5 5/1/09 UK F 99 2 2 1 2 1
选入(保留) 变量
- 通过数据框索引进行选择
newdata <- leadership[,c(6:10)]
> print(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
也可以通过变量名实现同样的运行效果,下面会用到一个字符串拼接函数paste
。
- 通过变量名进行选择
varlist <- c("q1", "q2", "q3", "q4", "q5") # 这两句是等价的
varlist <- paste("q", 1:5, sep = '') # 这两句是等价的
newdata1 <- leadership[varlist]
> print(newdata1 )
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
剔除(丢弃) 变量
-
通过变量名
剔除变量的原因有很多。 举例来说, 如果某个变量中有很多缺失值, 你可能就想在进一步分析之前将其丢弃。这里会用到一个判断是否包含其中的语句%in%
:
varlist <- names(leadership) %in% c("q3", "q4")
newdata <- leadership[!varlist]
> print(newdata )
manager date 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 UK F 99 2 2 1
对上述语句的说明,
-
names(leadership)
生成了包含所有变量名的字符型向量; -
names(leadership) %in% c("q3", "q4")
返回一个逻辑型向量,匹配"q3", "q4"
为TRUE
,其它为FALSE
。 -
!varlist
运算符!
取非将逻辑反转,即FALSE
变为TRUE
,其它TRUE
变为FALSE
; -
leadership[!varlist]选取逻辑值为
TRUE
的列,"q3", "q4"
剔除掉。 -
通过索引值
同时,也可以根据索引值前面加-
进行剔除;
newdata <- leadership[c(-8,-9)]
> print(newdata)
manager date 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 UK F 99 2 2 1
- 通过将若干变量赋值为
NULL
leadership$q3 <- leadership$q4 <- NULL
> print(leadership)
manager date 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 UK F 99 2 2 1
注意, NULL
与NA
(表示缺失) 是不同的。
选入观测
选入或剔除观测(行) 通常是成功的数据准备和数据分析的一个关键方面。
- 通过提供行下标,列下标留空的方式
> newdata <- leadership[leadership$gender == "M" , ]
> print(newdata )
manager date 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
上例中,选择了性别是男性的观测。
subset()函数
使用subset() 函数大概是选择变量和观测最简单的方法了。 两个示例
如下:
newdata <- subset(leadership, age >= 35 | age < 24,
select=c(q1, q2, q3, q4)) #选择所有age值大于等于35或小于24岁的q1至q4的变量
newdata <- subset(leadership, gender=="M" & age > 25,
select=gender:q4) # 选择所有25岁以上的男性,gender至q4的变量
随机抽样
sample()
函数能够让你从数据集中(有放回或无放回地) 抽取大小为n 的一个随机样本。
使用以下语句从leadership 数据集中不放回地随机抽取一个大小为3的样本:
mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE),]
> print(mysample )
manager date country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
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
网友评论