I need to gather_
on all columns of a dataframe, except for one. Example:
# I want to generate a dataframe whose column names are the letters of the alphabet. If you know of a simpler way, let me know!
foo <- as.data.frame(matrix(runif(100), 10, 10))
colnames(foo) <- letters[1:10]
Now, suppose I want to gather on all columns except column e
. This won't work:
mycol <- "e"
foo_melt <- gather_(foo, key = "variable", value = "value", -mycol)
#Error in -mycol : invalid argument to unary operator
This will:
column_list <- colnames(foo)
column_list <- column_list[column_list != mycol]
foo_melt <- gather_(foo, key = "variable", value = "value", column_list)
Looks quite convoluted if you ask me. Isn't there any simpler way?
One option is one_of
with gather
res1 <- gather(foo, key = "variable", value = "value", -one_of(mycol))
and if we need gather_
, then setdiff
can be used
res2 <- gather_(foo, key = "variable", value = "value", setdiff(names(foo), mycol))
identical(res1, res2)
#[1] TRUE
dim(res1)
#[1] 90 3
head(res1, 3)
# e variable value
#1 0.8484310 a 0.2730847
#2 0.0501665 a 0.8129584
#3 0.6689233 a 0.5457884
Try this:
foo_melt <- gather_(foo, key = "variable", value = "value",names(foo)[-5])
This will give you all columns except the 5th ("e").
> head(foo_melt)
e variable value
1 0.6359394 a 0.9567835
2 0.1558724 a 0.7778139
3 0.1418696 a 0.2132809
4 0.7184244 a 0.4539194
5 0.4487064 a 0.1049392
6 0.5963304 a 0.8692680
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With