Factors are a very useful type of variable in R, but they can also drive you nuts. Especially the "stealth factor" that you think of as character.

Can we soften some of their sharp edges?

Binding two factors

library(foofactors)
library(forcats)
a <- factor(c("character", "hits", "your", "eyeballs"))
b <- factor(c("but", "integer", "where it", "counts"))

Simply catenating two factors leads to a result that most don't expect.

c(a, b)

The fbind() function glues two factors together and returns factor.

fbind(a, b)

Get frequencies for the levels of a factor

Often we want a table of frequencies for the levels of a factor. The base table() function returns an object of class table, which can be inconvenient for downstream work. Processing with as.data.frame() can be helpful but it's a bit clunky.

set.seed(1234)
x <- factor(sample(letters[1:5], size = 100, replace = TRUE))
table(x)
as.data.frame(table(x))

The freq_out() function returns a frequency table as a well-named tbl_df:

freq_out(x)

Detect factors that should be character

We regard a factor is a true factor if # unique values != length, otherwise it is a chracter. If we want to judge whether a factor is a true factor or a character,use our dec_fac() function to achieve this goal!

factor1<-factor(c("small","medium","big"))
factor2<- factor(c("1","2","2"))

We know factor1 is a character while factor2 is a really factor.

dect_fac(factor1)
dect_fac(factor2)

See, use our function can get the same result!

reorder a factor in a descending order

In R, we have a function fct_rev() to reorder a factor. This can help us reorder a factor in a descending order. This is sometimes useful when plotting a factor

x<-factor(c("1", "2", "3", "4"))
y<-factor(c("a","b","c","d"))
levels(fct_rev(x))
levels(fct_rev(y))

Use our reorder_des() function, you can get the same result!

levels(reorder_desc(x))
levels(reorder_desc(y))

sets levels to the order in which they appear in the data.

Sometimes, we want to get the levels of a factor and also keep their previous order in the factor.

a<-factor(c("b","b","c","a"))
b<-factor(c("2","2","1","4"))

And we know the results should be "b","c","a" and "2","1","4". Now we can use our function to check the answers.

levels(set_level(a))
levels(set_level(b))

See, the same answer as what we expect it to be.



xinyaofan/foofactors documentation built on May 29, 2019, 2:29 p.m.