假设我有一个包含A,B和C列的data.table
我想编写一个应用过滤器的功能(例如A> 1)但是" A"需要是动态的(函数的参数),所以如果我通知A,它确实A> 1;如果我通知B,它会B> 1,依此类推......(A和B总是列名称,当然)
实施例: 让我们说我的数据如下:我想做" A == 1"并且它将返回绿线,或者做" B == 1& Ç== 1"并返回蓝线。
可以这样做吗? 感谢
答案 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)