问题陈述:我正在创建一个函数,需要根据用户提供的子群体(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/