2016-11-22 43 views
5

Bir veri çerçevesi dışındaki tüm sütunlarda gather_'a ihtiyacım var. Örnek:Tüm sütunlarda bir tane nasıl toplayabilirim?

Şimdi
# 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] 

, ben sütunda e dışındaki tüm sütunlarda toplamak istediğinizi varsayalım. Bu işe yaramaz:

mycol <- "e" 
foo_melt <- gather_(foo, key = "variable", value = "value", -mycol) 
#Error in -mycol : invalid argument to unary operator 

Bu irade: Bana sorarsanız

column_list <- colnames(foo) 
column_list <- column_list[column_list != mycol] 
foo_melt <- gather_(foo, key = "variable", value = "value", column_list) 

oldukça dolambaçlı görünüyor. Daha basit bir yolu yok mu?

+2

bir yöntem, 'setdiff' yani' gather_ (foo anahtar = "Değişken", değeri = "değeri," setdiff (isimler (foo), Mycol)) ' – akrun

cevap

9

Seçeneklerden biri gather

res1 <- gather(foo, key = "variable", value = "value", -one_of(mycol)) 

ile one_of ve biz gather_ gerekiyorsa, o zaman 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

Kusursuz! Şimdi toplamana ihtiyacım yok - şimdi onu kullandım, çünkü yeniden şekillendirmenin değişkeni dinamik, ama 'one_of' ile hala 'topla' kullanabilirim. – DeltaIV

1

bu deneyin kullanılabilir:

foo_melt <- gather_(foo, key = "variable", value = "value",names(foo)[-5]) 

Bu hepinizi verecektir 5. ("e") dışındaki sütunlar.

> 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