2013-10-20 55 views
9

如何避免將循環用於基於多個因子級別的數據框子集?將多個因子級別的數據集子集

在以下示例中,我所需的輸出是一個數據幀。數據框應包含原始數據框的行,其中「代碼」中的值等於「選定」中的值之一。

工作實施例:

#sample data 
Code<-c("A","B","C","D","C","D","A","A") 
Value<-c(1, 2, 3, 4, 1, 2, 3, 4) 
data<-data.frame(cbind(Code, Value)) 

selected<-c("A","B") #want rows that contain A and B 

#Begin subsetting 
result<-data[which(data$Code==selected[1]),] 
s1<-2 
while(s1<length(selected)+1) 
{ 
    result<-rbind(result,data[which(data$Code==selected[s1]),]) 
    s1<-s1+1 
} 

這是一個更大的數據集的玩具實例,所以「選擇」可能含有元素和數據的大量的行的大量。所以我想避免循環。

回答

24

您可以使用%in%

data[data$Code %in% selected,] 
    Code Value 
1 A  1 
2 B  2 
7 A  3 
8 A  4 
4

試試這個:

> data[match(as.character(data$Code), selected, nomatch = FALSE), ] 
    Code Value 
1  A  1 
2  B  2 
1.1 A  1 
1.2 A  1 
2

下面是另一個:

data[data$Code == "A" | data$Code == "B", ] 

另外值得一提的是,子集的因素並不一定是部分如果數據幀的長度和順序與數據幀行相匹配,在這種情況下,我們無論如何都從這個因素制定了數據框架。所以,

data[Code == "A" | Code == "B", ] 

也工作,這是一個約R.

真正有用的東西之一