Filter data table by dynamic column name

前端 未结 4 1488
失恋的感觉
失恋的感觉 2020-12-11 06:40

lets say I have a data.table with columns A, B and C

I\'d like to write a function that applies a filter (for example A>1) but \"A\" needs to be dynamic (the functio

相关标签:
4条回答
  • 2020-12-11 07:04

    Why write a function? You can do this...

    Specifically:

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

    where d is the dataframe d$A is the variable and d.new is a new dataframe.

    More generally:

    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
    

    To create a new column:

    If you don't want to actually create a new dataframe but want to create an indicator variable you can use ifelse. This is most similar to coloring rows as shown in your example. Code below:

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

    0 讨论(0)
  • 2020-12-11 07:09

    You can try

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

    If you need to make the value also dynamic

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

    data

    set.seed(24)
    df1 <- data.frame(A=sample(-5:10, 20, replace=TRUE), 
          B=rnorm(20), C=LETTERS[1:20], stringsAsFactors=FALSE) 
    
    0 讨论(0)
  • 2020-12-11 07:22

    If your data is

    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)
    

    you can store your condition(s) in a variable x

    x <- quote(a >= 3)
    

    and filter the data.frame using dplyr (subsetting with [] won't work)

    library(dplyr)
    filter(df, x)
    

    or using data.table as suggested by @Frank

    library(data.table)
    dt[eval(x),]
    
    0 讨论(0)
  • 2020-12-11 07:22

    Try:

    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
    
    0 讨论(0)
提交回复
热议问题