Die*_*ego 4 r dataframe data.table
假设我有一个包含A,B和C列的data.table
我想写一个应用过滤器的函数(例如A> 1)但是"A"需要是动态的(函数的参数)所以如果我通知A,它会做A> 1; 如果我通知B,它会B> 1,依此类推......(A和B总是列名称,当然)
示例:假设我的数据如下,我想做"A == 1"并返回绿线,或执行"B == 1&C == 1"并返回蓝线.

可以这样做吗?谢谢
akr*_*run 11
你可以试试
f1 <- function(dat, colName){dat[eval(as.name(colName))>1]}
setDT(df1)
f1(df1, 'A')
f1(df1, 'B')
Run Code Online (Sandbox Code Playgroud)
如果你需要使值也是动态的
f2 <- function(dat, colName, value){dat[eval(as.name(colName))>value]}
f2(df1, 'A', 1)
f2(df1, 'A', 5)
Run Code Online (Sandbox Code Playgroud)
set.seed(24)
df1 <- data.frame(A=sample(-5:10, 20, replace=TRUE),
B=rnorm(20), C=LETTERS[1:20], stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
如果您的数据是
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)
Run Code Online (Sandbox Code Playgroud)
您可以将您的条件存储在变量中 x
x <- quote(a >= 3)
Run Code Online (Sandbox Code Playgroud)
并使用dplyr(使用[] 进行子集将无效)过滤data.frame
library(dplyr)
filter(df, x)
Run Code Online (Sandbox Code Playgroud)
或者data.table按照@Frank的建议使用
library(data.table)
dt[eval(x),]
Run Code Online (Sandbox Code Playgroud)
尝试:
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
Run Code Online (Sandbox Code Playgroud)