按照多个因子水平对数据框进行子集筛选

24

如何避免使用循环基于多个因子水平来对数据框进行子集化?

在下面的例子中,我希望得到一个数据框。该数据框应包含原始数据框中“Code”列值等于“selected”列表中某个值的行。

工作示例:

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

这只是一个较大数据集的玩具示例,因此“selected”可能包含许多元素,而数据可能有许多行。因此,我想避免循环。

3个回答

44

您可以使用%in%

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

5

这里还有一个:

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

值得一提的是,如果子集因子与数据框在长度和顺序上匹配,则子集因子不必成为数据框的一部分。在这种情况下,我们仍然可以从该因子创建数据框。因此,
data[Code == "A" | Code == "B", ]

也可以工作,这是 R 的一项非常有用的功能之一。


在Jupyter笔记本中,第二部分对我没有起作用。 - JacaByte

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接