如何在除一个列外的所有列上进行聚合?

8
我需要在数据框的所有列上进行`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)

如果你问我,这看起来非常混乱。难道没有更简单的方法吗?


2
一个选项是 setdiff,即 gather_(foo, key = "variable", value = "value", setdiff(names(foo), mycol)) - akrun
2个回答

11

一个选项是使用one_ofgather

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
太棒了!现在我甚至不需要 gather_ 了 - 我之前使用它是因为要重塑的变量是动态的,但是有了 one_of,我仍然可以使用 gather - DeltaIV

2

试试这个:

foo_melt <- gather_(foo, key = "variable", value = "value",names(foo)[-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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接