问题陈述: :我正在创建一个函数,该函数需要根据用户提供的子群体(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%”,“> =”等)中可能会非常不同。没有办法知道这个先验,因此,我需要通过对象而不是直接传递这些条件。预先非常感谢。
答案 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