我需要在数据框的所有列上gather_
,除了一个。例如:
# 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]
现在,假设我想收集列e
以外的所有列。这不起作用:
mycol <- "e"
foo_melt <- gather_(foo, key = "variable", value = "value", -mycol)
#Error in -mycol : invalid argument to unary operator
这将:
column_list <- colnames(foo)
column_list <- column_list[column_list != mycol]
foo_melt <- gather_(foo, key = "variable", value = "value", column_list)
如果你问我,看起来很复杂。有没有更简单的方法?
答案 0 :(得分:10)
一个选项是one_of
gather
res1 <- gather(foo, key = "variable", value = "value", -one_of(mycol))
如果我们需要gather_
,则可以使用setdiff
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
答案 1 :(得分:2)
试试这个:
foo_melt <- gather_(foo, key = "variable", value = "value",names(foo)[-5])
这将为您提供除第5列以外的所有列(&#34; e&#34;)。
> 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