使用逻辑表达式向量来对R中的数据帧进行子集化

时间:2018-06-16 22:01:38

标签: r dataframe subset

我正在尝试使用逻辑表达式向量来对数据帧进行子集化。举个简单的例子,这里是一个数据框,我将使用逻辑表达式进行子集化。首先,我将手动输入逻辑表达式:

> 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

有什么建议吗?

3 个答案:

答案 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)

我们可以使用parseeval将条件评估为字符串向量。

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]