按动态列名过滤数据表

时间:2015-04-10 14:27:11

标签: r dataframe data.table

假设我有一个包含A,B和C列的data.table

我想编写一个应用过滤器的功能(例如A> 1)但是" A"需要是动态的(函数的参数),所以如果我通知A,它确实A> 1;如果我通知B,它会B> 1,依此类推......(A和B总是列名称,当然)

实施例: 让我们说我的数据如下:我想做" A == 1"并且它将返回绿线,或者做" B == 1& Ç== 1"并返回蓝线。

enter image description here

可以这样做吗? 感谢

4 个答案:

答案 0 :(得分:10)

你可以尝试

f1 <- function(dat, colName){dat[eval(as.name(colName))>1]}
setDT(df1)
f1(df1, 'A')
f1(df1, 'B')

如果您需要使值也动态

f2 <- function(dat, colName, value){dat[eval(as.name(colName))>value]}
f2(df1, 'A', 1)
f2(df1, 'A', 5)

数据

set.seed(24)
df1 <- data.frame(A=sample(-5:10, 20, replace=TRUE), 
      B=rnorm(20), C=LETTERS[1:20], stringsAsFactors=FALSE) 

答案 1 :(得分:8)

如果您的数据是

a <- c(1:9)
b <- c(10:18)
# create a data.frame
df <- data.frame(a,b)
# or a data.table
dt <- data.table(a,b)

您可以将条件存储在变量x

x <- quote(a >= 3)

并使用dplyr过滤data.frame(用[]赢得工作子集)

library(dplyr)
filter(df, x)

或使用@Frank

建议的data.table
library(data.table)
dt[eval(x),]

答案 2 :(得分:6)

尝试:

dt = data.table(A=c(1,1,2,3,1), B=c(4,5,1,1,1))

f=function(dt, colName) dt[dt[[colName]]>1,]
#> f(dt, 'A')
#   A B
#1: 2 1
#2: 3 1

答案 3 :(得分:0)

为什么要写一个函数?你可以这样做......

<强>具体地:

d.new = d [d $ A→1,]

其中 d是数据框d$A是变量而d.new是新数据框。

更一般地说:

data=d #data frame
variable=d$A #variable 
minValue=1 #minimum value
d.new=data[variable>minValue,] #create new data frame (d.new) filtered by min value

要创建新列:

如果您不想实际创建新数据框但想要创建指标变量,则可以使用ifelse。这与着色行最相似,如示例所示。代码如下:

d$indicator1=ifelse(d$X1>0,1,0)