按动态列名过滤数据表

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)


rmu*_*uc8 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)
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)

  • 好的解决方案 `data.table`有一些非常相似的东西,实际上:`setDT(df)[eval(x),]` (2认同)

Col*_*vel 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
Run Code Online (Sandbox Code Playgroud)