过滤数据框

机器算法验证 r
2022-02-14 17:21:18

仍在学习 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 可以是一个很大的列列表,那么执行此过滤器的推荐方法或方法是什么?谢谢

1个回答

如果要在子集函数中组合多个过滤器,请使用逻辑运算符:

 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,]

apply的第一个参数提供了我们需要过滤的列。第二个参数是 1,这意味着我们正在循环遍历数据行。第三个参数是未命名的单行函数,如果“E”出现在行中,则返回TRUE,如果“E”不存在,则返回FALSE

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

更新

使用 grep 也可以达到同样的效果:

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

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