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

标签 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%”、“">=”等)方面可能变化很大。无法先验地知道这一点,因此,我需要通过对象而不是直接传递这些条件。非常感谢。

最佳答案

> 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

使用字符对象的方法二:

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

关于r - 将具有多个条件语句的字符参数转换为独立于数据帧名称的函数中的逻辑子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53149081/

相关文章:

r - 将 dcast.data.table 与日期值和聚合一起使用

R boxplot : How to customize the appearance of the box-and-whisker plots (e. g.,删除线条或边框,更改异常值的符号)

r - 从列/列表中过滤尝试错误对象(dplyr,但也更通用)

R : Int vs Num Anomaly in Vector

r - 带有多行标题的print.xtable?

动态重命名变量

regex - 保护特定单词,从字符串中删除字母

r - 如何在 R(或 excel)中执行这种独特的整形?

r - ggbiplot - 改变点的大小

r - 更改绘图文本的对齐方式