2013-10-20 50 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.

真正有用的东西之一