【问题标题】:Filter data table by dynamic column name按动态列名过滤数据表
【发布时间】:2015-04-10 14:27:10
【问题描述】:

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

我想编写一个应用过滤器的函数(例如 A>1),但“A”需要是动态的(函数的参数),所以如果我通知 A,它会执行 A>1;如果我通知 B,它会执行 B>1 等等...(当然,A 和 B 始终是列名)

示例: 假设我的数据如下,我想做“A==1”,它会返回绿线,或者做“B==1 & C==1”,然后返回蓝线。

这可以吗? 谢谢

【问题讨论】:

标签: r dataframe data.table


【解决方案1】:

你可以试试

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) 

【讨论】:

    【解决方案2】:

    如果你的数据是

    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),]
    

    【讨论】:

    • 感谢您的提示,它在数据帧上的作用就像一个魅力
    • 不错的解决方案; data.table 有一些非常相似的东西,实际上:setDT(df)[eval(x),]
    • @Frank 谢谢。随意张贴。如果没有,我应该包括它吗?
    • 是的,请继续添加(如果需要)。我在这里提到它是因为我认为它与您的回答很自然。
    【解决方案3】:

    试试:

    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
    

    【讨论】:

      【解决方案4】:

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

      具体来说:

      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&gt;0,1,0)

      【讨论】:

      • A 需要是动态的,例如 myvar &lt;- "A",而您只能使用 myvar。使用data.table 你可以使用d[get(myvar)&gt;1,] 或使用data.frame d[d[[myvar]]&gt;1,],但我不认为$ 可以解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多