过滤数据框


12

仍在学习R中的基本功能,子集功能似乎仅基于基于单个列的条件(有或没有多个条件)进行过滤?

如何轻松地从数据框中过滤数据?

  1. 当您有多个条件时

  2. 需要在可用列之间应用条件时。

示例:给定一个数据框,其中包含

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

说我想过滤此数据帧,以便仅命名D1到D4中的任何一个为'E'的名称,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

假设D1可能是一大列列,执行此过滤器的推荐方法是什么?谢谢

Answers:


26

如果你想几个过滤器组合子集功能使用逻辑运算符:

 subset(data, D1 == "E" | D2 == "E")

将选择D1列或D2列的值为“ E”的行。查看帮助页面以获取可用的逻辑运算符:

 > ?"|"

对于第二个问题,您需要过滤行。这可以通过以下方式实现

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

第一个参数应用 suplies上,我们需要过滤的列。第二个参数为1,表示我们正在遍历数据行。第三个参数是未命名的单行函数,如果该行中存在“ E”,则返回TRUE;如果不存在“ E”,则返回FALSE

apply函数的结果将是逻辑向量sel,其长度与数据中的行数相同。然后,我们使用此向量选择必要的行。

更新资料

使用grep可以实现相同的目的:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

在R grep中使用默认参数返回在提供的向量中具有匹配模式的元素数。


2
另一个有用的功能是any。例如,如果您要检查向量的至少一个元素,= 10可以编写(any(v==10))。
nico

@nico是的,但是10%in%v有9个字符,并且可以 10个变体:)。尽管对于数字向量,最好使用等式,因为R是智能的,并且如果您的数据是与实数混合的整数,则它将正确地识别出您的数据集中有10个。
mpiktas 2011年

正则表达式的情况如何?假设您不想使用完全匹配的方法?和其他语言一样,它们接近〜=吗?R中
最接近

@Biorelated有关POSIX 1003.2或与Perl兼容的正则表达式的信息,请参见grepagrep,以及相关文档。
chl

@Biorelated,我用grep的例子更新了答案。
mpiktas 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.