23

如何避免使用循环根据多个因子级别对数据帧进行子集化?

在以下示例中,我想要的输出是一个数据框。数据框应包含原始数据框的行,其中“代码”中的值等于“选定”中的值之一。

工作示例:

#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
}

这是一个更大数据集的玩具示例,因此“选定”可能包含大量元素并且数据包含大量行。因此,我想避免循环。

4

3 回答 3

42

您可以使用%in%

  data[data$Code %in% selected,]
  Code Value
1    A     1
2    B     2
7    A     3
8    A     4
于 2013-10-20T22:11:26.627 回答
5

这是另一个:

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

还值得一提的是,如果子集因子在长度和顺序上与数据框行匹配,则它不必是数据框的一部分。在这种情况下,无论如何我们都是根据这个因素制作我们的数据框。所以,

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

也有效,这是关于 R 的真正有用的事情之一。

于 2016-10-17T15:00:03.773 回答
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
于 2013-10-20T22:05:55.887 回答