1. 程式人生 > >R語言學習筆記之一:選取子集

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、通過邏輯向量選擇(保留法,丟棄法)