我怎样才能 gather_ 在除一列以外的所有列上?
How can I gather_ on all columns but one?
我需要 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)
如果你问我,看起来很费解。有没有更简单的方法?
一个选项是 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
试试这个:
foo_melt <- gather_(foo, key = "variable", value = "value",names(foo)[-5])
这将为您提供除第 5 列 ("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
我需要 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)
如果你问我,看起来很费解。有没有更简单的方法?
一个选项是 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
试试这个:
foo_melt <- gather_(foo, key = "variable", value = "value",names(foo)[-5])
这将为您提供除第 5 列 ("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