A predicate is a function that returns a single TRUE or FALSE, for example, is.factor(), all(), or is.NULL(). A predicate functional is a function that applies a predicate to each element of a list or data frame. For example, we can define a predicate functional where() that checks the type of each column in a data frame.
where = function(f, x) {
# Applies a predicate function to every element of a list or data frame.
# f: a predicate function
# x: a list or data frame
#
# Returns a logical vector.
vapply(x, f, logical(1))
}Here’s how you’d use it.
# make a example data frame
df = data.frame(x = 1:3, y = c("a", "b", "c"), z = c("Alex", "Bob", "Chris"))
# check if each column of the data frame is a factor
where(is.factor, df)## x y z
## FALSE TRUE TRUE# check if each column of the data frame is an integer
where(is.integer, df)## x y z
## TRUE FALSE FALSE# check if each column of the data frame is a character
where(is.character, df)## x y z
## FALSE FALSE FALSEThere’re 3 common predicate functionals already defined in base R, namely, Filter(), Find(), Position(). Here’s how you can use them.
# filter the factors in a data frame
subdf = Filter(is.factor, df)
subdf## y z
## 1 a Alex
## 2 b Bob
## 3 c Chrisstr(subdf) # note: Filter() returns a data frame## 'data.frame': 3 obs. of 2 variables:
## $ y: Factor w/ 3 levels "a","b","c": 1 2 3
## $ z: Factor w/ 3 levels "Alex","Bob","Chris": 1 2 3# find the 1st factor starting from the Left in a data frame
x_factor = Find(is.factor, df)
x_factor## [1] a b c
## Levels: a b cstr(x_factor) # note: Find() returns the first factor it finds from the left## Factor w/ 3 levels "a","b","c": 1 2 3# gives the position of the 1st factor starting from the Right in a data frame
Position(is.factor, df, right=T)## [1] 3This article is inspired by Hadley’s book “Advanced R”, which can be obtained from Amazon.