我正在尝试使用逻辑表达式向量来对数据帧进行子集化。举个简单的例子,这里是一个数据框,我将使用逻辑表达式进行子集化。首先,我将手动输入逻辑表达式:
> dat <- data.frame(x = c(0,0,1,1), y = c(0,0,0,1), z = c(0,1,1,1))
> dat
x y z
1 0 0 0
2 0 0 1
3 1 0 1
4 1 1 1
> subset(dat, x == 1)
x y z
3 1 0 1
4 1 1 1
如果我有一个逻辑表达式向量,我如何从该向量调用并将它们应用于子集方法?这是一种不起作用的方式:
> criteria <- as.factor(c("x == 1", "y == 1", "y == 1 & z == 1"))
> subset(dat, criteria[1])
Error in subset.data.frame(dat, criteria[1]) : 'subset' must be logical
有什么建议吗?
答案 0 :(得分:3)
您无法制作矢量的原子矢量,因此您可以将它们包含在列表中。使用[
进行子集设置,比subset
更容易编程,
dat <- data.frame(x = c(0,0,1,1),
y = c(0,0,0,1),
z = c(0,1,1,1))
indices <- list(dat$x == 1,
dat$y == 1,
dat$x == 1 & dat$z == 1)
str(indices)
#> List of 3
#> $ : logi [1:4] FALSE FALSE TRUE TRUE
#> $ : logi [1:4] FALSE FALSE FALSE TRUE
#> $ : logi [1:4] FALSE FALSE TRUE TRUE
dat[indices[[1]], ]
#> x y z
#> 3 1 0 1
#> 4 1 1 1
lapply(indices, function(i) dat[i, ])
#> [[1]]
#> x y z
#> 3 1 0 1
#> 4 1 1 1
#>
#> [[2]]
#> x y z
#> 4 1 1 1
#>
#> [[3]]
#> x y z
#> 3 1 0 1
#> 4 1 1 1
答案 1 :(得分:3)
我们可以使用parse
和eval
将条件评估为字符串向量。
criteria <- c("x == 1", "y == 1", "y == 1 & z == 1")
subset(dat, eval(parse(text = criteria)))
# x y z
# 4 1 1 1
我们可以使用index来选择criteria
向量中的元素来对数据框进行子集化。
subset(dat, eval(parse(text = criteria[1])))
# x y z
# 3 1 0 1
# 4 1 1 1
答案 2 :(得分:2)
使用逻辑向量:
critearia <- dat$x == 1 & dat$y == 1 & dat$z == 1
subset(dat, critearia)
直接:
subset(dat, x == 1 & y == 1 & z == 1)
使用data.table
:
library(data.table)
dat <- as.data.table(dat)
dat[x == 1 & y == 1 & z == 1]