将具有多个条件语句的字符参数转换为独立于数据框名称的函数中的逻辑子集

时间:2018-11-05 05:58:24

标签: r

问题陈述: :我正在创建一个函数,该函数需要根据用户提供的子群体(subpop)参数对数据进行子集化;可以提供一个或多个条件作为字符,例如subpop = "sex ==1 & race4 == 2"

相关功能(节选)类似于:

collapse = function(data, subpop,...) {
data2 = subset(data, subpop[1])
...
}

使用 dput创建的样本数据集: 功能

    structure(list(sex = structure(c(0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 
1, 0, 1, 0, 1, 0, 0, 1, 0, 0), labels = c(male = 0, female = 1
), class = "labelled"), race4 = structure(c(2, 3, 3, 1, 2, 2, 
2, 2, 1, 3, 3, 1, 2, 1, 3, 2, 2, 1, 2, 2), labels = c(MexAm = 1, 
white = 2, black = 3, other = 4), class = "labelled")), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

到目前为止我的尝试: 如果直接将参数作为逻辑语句而不是通过对象传递,则可以轻松地对数据进行子集化。

> data2 = subset(data, sex ==1 & race4 == 2) #Attempt 1: Works
> dim(data2)
[1] 3 2

> subpop <- "sex ==1 & race4 == 2" #Attempt 2: Does not work
> y = with(data, subpop[1])
> data2 = subset(data, y)
Error in subset.data.frame(data, y) : 'subset' must be logical

> y = with(data, subpop[1]) #Attempt 3: Does not work; empty rows 
> data2 = subset(data, as.logical(y))
> dim(data2)
[1] 0 2

> data2=data[which(is.logical(subpop[1])),] #Attempt 4: Does not work; empty rows
> dim(data2)
[1] 0 2

> data2 = subset(data, pander::evals(subpop)) #Attempt 5: Does not work
Error in subset.data.frame(n, evals(subpop)) : 'subset' must be logical

> eval(parse(text == subpop)) #Attempt 6: Does not work
Error in parse(text == subpop) : unused argument (text == subpop)

这些只是我尝试过的几十个代码。在过去的几天里,我梳理了无数的论坛,讨论和帖子,但找不到任何东西。也许我在某处丢失了一些东西。这是我在该论坛上的第一篇文章,我真的希望有人能在这里为我提供帮助。

这里的根本问题是,无论我做什么,我似乎都无法让R将子组对象的内容识别为逻辑语句。

摘要 :如何传递包含一组条件的对象,以便R可以使用该对象的内容进行子集化。条件的数量在其数量,格式或使用的运算符类型(例如,“ ==”,“%in%”,“> =”等)中可能会非常不同。没有办法知道这个先验,因此,我需要通过对象而不是直接传递这些条件。预先非常感谢。

1 个答案:

答案 0 :(得分:2)

> subset(df, sex ==1 & race4 == 2)
   sex race4
5    1     2
8    1     2
13   1     2

我使用逻辑对象的方法:

# Create a logical object
> l<-df$sex ==1 & df$race4 == 2

> str(l) # check structure of 'l'
 logi [1:20] FALSE FALSE FALSE FALSE TRUE FALSE ...

> subset(df,l)
   sex race4
5    1     2
8    1     2
13   1     2

使用角色对象的方法II:

> a<-"sex ==1 & race4 == 2"
> subset(df, eval(parse(text=a)))
> sex race4
  5    1     2
  8    1     2
  13   1     2