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")
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, gender, age, q1, q2, q3, q4, q5, stringsAsFactors = FALSE)
一、保留法:
1、使用行数、列出取子集
dataframe[row indices,colum indices]
newdata <- leadership[, c(6:10)]
2、通过列名取子集
newdata <- leadership[c("q1", "q2", "q3", "q4", "q5")] ##只需要写列名称即可,行数取全量的(没有行row indices,)
3、生成逻辑向量法
newdata <- leadership[which(leadership$gender == "M" & leadership$age > 30), ]
(1) 逻辑比较 leadership$gender=="M" 生成了向量 c(TRUE, FALSE, FALSE, TRUE,FALSE) 。
(2) 逻辑比较 leadership$age > 30 生成了向量 c(TRUE, TRUE, FALSE, TRUE, TRUE) 。
(3) 逻辑比较 c(TRUE, FALSE, FALSE, TRUE, TRUE) & c(TRUE, TRUE, FALSE, TRUE,TRUE) 生成了向量 c(TRUE, FALSE, FALSE, TRUE, FALSE) 。
(4) 函数 which() 给出了向量中值为 TRUE 元素的下标。因此, which(c(TRUE, FALSE,FALSE, TRUE, FALSE)) 生成了向量 c(1, 4) 。
(5) leadership[c(1,4),] 从数据框中选择了第一个和第四个观测。这就满足了我们的选取准则(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)
5、随机抽样
leadership 数据集中随机抽取一个大小为3的样本
mysample <- leadership[sample(1:nrow(leadership),3,replace = F),]
二、丢弃法:
1、使用行数、列出取子集
newdata <- leadership[,-c(1:2)]
newdata <- leadership[-c(1:2)]
newdata <- leadership[,-c(7:8)]
newdata <- leadership[c(-7, -8)]
newdata <- leadership[-c(7:8)]
2、生成逻辑向量法
myvars <- names(leadership) %in% c("q3", "q4")
newdata <- leadership[!myvars]
##names(leadership) %in% c("q3", "q4") 返回了一个逻辑型向量, names(leadership)
中每个 匹配 q3 或 q4 的元素的值为 TRUE ,反之为 FALSE : c(FALSE, FALSE, FALSE, FALSE,FALSE, FALSE, FALSE, TRUE, TRUE, FALSE) 。
错误的方法:
newdata <- leadership[!c("q1", "q2", "q3", "q4", "q5")] ##里边不是逻辑向量
总结:
1、可以用行列数取子集(保留法、丢弃法都可以)
2、可以通过列名选取(保留法)
3、通过逻辑向量选择(保留法,丢弃法)
manager <- c(1, 2, 3, 4, 5)
date <- c("10/24/08", "10/28/08", "10/1/08", "10/12/08", "5/1/09")
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, gender, age, q1, q2, q3, q4, q5, stringsAsFactors = FALSE)
一、保留法:
1、使用行数、列出取子集
dataframe[row indices,colum indices]
newdata <- leadership[, c(6:10)]
2、通过列名取子集
newdata <- leadership[c("q1", "q2", "q3", "q4", "q5")] ##只需要写列名称即可,行数取全量的(没有行row indices,)
3、生成逻辑向量法
newdata <- leadership[which(leadership$gender == "M" & leadership$age > 30), ]
(1) 逻辑比较 leadership$gender=="M" 生成了向量 c(TRUE, FALSE, FALSE, TRUE,FALSE) 。
(2) 逻辑比较 leadership$age > 30 生成了向量 c(TRUE, TRUE, FALSE, TRUE, TRUE) 。
(3) 逻辑比较 c(TRUE, FALSE, FALSE, TRUE, TRUE) & c(TRUE, TRUE, FALSE, TRUE,TRUE) 生成了向量 c(TRUE, FALSE, FALSE, TRUE, FALSE) 。
(4) 函数 which() 给出了向量中值为 TRUE 元素的下标。因此, which(c(TRUE, FALSE,FALSE, TRUE, FALSE)) 生成了向量 c(1, 4) 。
(5) leadership[c(1,4),] 从数据框中选择了第一个和第四个观测。这就满足了我们的选取准则(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)
5、随机抽样
leadership 数据集中随机抽取一个大小为3的样本
mysample <- leadership[sample(1:nrow(leadership),3,replace = F),]
二、丢弃法:
1、使用行数、列出取子集
newdata <- leadership[,-c(1:2)]
newdata <- leadership[-c(1:2)]
newdata <- leadership[,-c(7:8)]
newdata <- leadership[c(-7, -8)]
newdata <- leadership[-c(7:8)]
2、生成逻辑向量法
myvars <- names(leadership) %in% c("q3", "q4")
newdata <- leadership[!myvars]
##names(leadership) %in% c("q3", "q4") 返回了一个逻辑型向量, names(leadership)
中每个 匹配 q3 或 q4 的元素的值为 TRUE ,反之为 FALSE : c(FALSE, FALSE, FALSE, FALSE,FALSE, FALSE, FALSE, TRUE, TRUE, FALSE) 。
错误的方法:
newdata <- leadership[!c("q1", "q2", "q3", "q4", "q5")] ##里边不是逻辑向量
总结:
1、可以用行列数取子集(保留法、丢弃法都可以)
2、可以通过列名选取(保留法)
3、通过逻辑向量选择(保留法,丢弃法)