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

R 将具有多个条件语句的字符参数转换为独立于数据帧名称的函数中的逻辑to子集,r,R,问题陈述:我正在创建一个函数,该函数需要根据用户提供的子总体(subpopulation,subpop)参数对数据进行子集;一个或多个条件可以作为字符提供,例如,subpop=“sex==1&race4==2” 相关函数(节选)如下所示: collapse = function(data, subpop,...) { data2 = subset(data, subpop[1]) ... } 使用dput函数创建的样本数据集: structure(list(sex = structur

问题陈述:我正在创建一个函数,该函数需要根据用户提供的子总体(subpopulation,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)
>data2=子集(data,sex==1&race4==2)#尝试1:有效
>dim(数据2)
[1] 3 2
>子op y=with(数据,子op[1])
>数据2=子集(数据,y)
subset.data.frame(数据,y)中出错:“subset”必须是逻辑的
>y=带(数据,子表[1])#尝试3:不起作用;空行
>数据2=子集(数据,如逻辑(y))
>dim(数据2)
[1] 0 2
>数据2=数据[是逻辑的(子项[1]),]#尝试4:不工作;空行
>dim(数据2)
[1] 0 2
>data2=子集(数据,pander::evals(subtop))#尝试5:不起作用
subset.data.frame(n,evals(subtop))中出错:'subset'必须是逻辑的
>eval(parse(text==subtop))#尝试6:不起作用
分析错误(text==subpop):未使用的参数(text==subpop)
这些只是我尝试过的几十个代码中的几个。在过去的几天里,我浏览了无数的论坛、讨论和帖子,但没有找到什么。也许我在什么地方遗漏了什么。这是我在这个论坛上的第一篇帖子,我真的希望有人能在这里帮助我

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

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

> 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
#创建一个逻辑对象
>l str(l)#检查“l”的结构
逻辑[1:20]假假假假假假假假假假假假。。。
>子集(df,l)
性竞赛4
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
>一个子集(df,eval(parse(text=a)))
>性竞赛4
5    1     2
8    1     2
13   1     2

Wow!非常感谢@rar。这是否意味着在创建逻辑对象时,必须包含对数据帧的引用?例如。,l@Ter:我已经更新了回复。如果这回答了您的问题,请接受答案。谢谢。我接受了答案,但还有最后一个问题。您提供的第二个代码(字符串参数)在常规R中运行良好,但在R studio中则不行。在后者中,我得到了这个命令的以下错误:>subpop=“race4==1&sex==1”>data1=subset(数据,eval(parse(text=subpop)))parse(text=subpop)中的错误:未使用的参数(text=subpop)。想法?@Ter:这很奇怪,因为对我来说,它在R工作室也很好用。抱歉,我无法对此发表评论。别担心。你是救命恩人;我将对逻辑对象使用第一种方法。非常感谢您的时间。